記事一覧

-Androidリリース編- Google SignInの設定方法 | Xamarin.Forms


今回はXamarin.AndroidアプリでGoogle SignIn認証を動作させる方法をご紹介します。以前の記事ではデバッグ用のGoogle SignIn認証でした。今回はRelease編です。
Androidでの実績は様々掲載されていますが、環境や設定が若干異なっており参考になりませんでした。そしてXamarinでのGoogle SignInの実績がどこにも載っておらず、Xamarin公式ページにも古いコードが掲載されている状況で、私は正解を見つけるのに多大な時間を費やしました。2週間ほど試行錯誤したでしょうか。Google SignInの設定方法を再確認できた結果、以下のようなルールが見えてきました。



前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.3.0.795 (NuGet Xamarin.Forms 2.3.4.247)
・Java SE Development Kit 1.8.121
・Android SDK Manager rev25.2.5



前提.Google SignInの設定方法のまとめ

<VisualStudioでの設定方法>
(1)GooglePlayServicesのNugetパッケージは最新バージョンでなくて良い
(2)Google-Services.jsonファイルは必要ない。
(3)ClientIDはコード上でハードコートする必要が無い。
<Google API Consoleの設定方法>
(4)パーミッションの設定
(5)Degug用とRelease用でClientIDを分けなければならない。
(6)Webアプリケーション用のClientIDをひとつ用意しないければならない。
<ソースについて>
(7)接続方法の記述は2通り存在する。

上記の条件に付いて以下に説明をさせて頂きたいと思います。



1.Nugetパッケージ

結局リリースビルドで成功したGooglePlaySerivcesのバージョンは29.0.0.2で大丈夫した。
v42.1021.00でもGoogle SignInに成功しましたが、Multi-Dexを有効にせねばならず、ハードルが高い印象です。
最低限としては以下のパッケージをインストールしてください。
Xamarin.GooglePlaySerivces.Auth v29.0.0.2
Xamarin.GooglePlayServices.Base v29.0.0.2
Xamarin.GooglePlayServices.Basement v29.0.0.2
Xamarin.GooglePlayServices.Plus v29.0.0.2



2.Google-Services.jsonファイル

Google-Services.jsonファイルは必要ありません。
尚、アプリ内に配置し、ビルドアクションをGoogleServicesJsonにすることにより、このファイルから得られる情報は、GetString(Resource.String.default_web_client_id) で取得できるようになるぐらいで、特にメリットを感じませんでした。ビルドアクションをGoogleServicesJsonでビルドが通るようにするにはXamarin.GooglePlayServices.Tasksをインストールし、Xamarin.GooglePlayServices関連のパッケージバージョンを32以上にしなければならず(さらにはMulti-Dexを有効にする必要もあります)、意味のない作業にハードルが上がります。
検証した結果、実際の認証には必要が皆無であると結論付けております。



3.ClientIDのソース上での取り扱い

GoogleSignInOptionsの設定として、.RequestServerAuthCode(serverClientId, false)や.RequestIdToken(serverClientId) として設定することが他のサイトで取り上げられておりますが、一切必要ありません。記述が無くてもサインイン可能です。
Google API ConsoleでSHA1のみの振り分けがされているためだと推測しています。



4.パーミッションの設定

以前の記事同様以下のように設定する必要があります。
AndroidManifest.xmlに追記します。

AndroidManifest.xml
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />



5.Debug用とRelease用との切り分け

Google Api Console の管理画面にて Debug用のSHA1と Release用のSHA1を登録することにより切り分けます。
Debug用とRelease用のSHA1を取得する方法につきましては、前回の記事をご確認くださいませ。

xamarin_google_signin_06.png



6.Webアプリケーション用のClientID

ただし、Webアプリケーション用のClientIDをひとつ用意しなければなりません。
これはDebug用とRelease用で共通だと思います。なぜかSHA1での接続が優先されているはずですが、Webアプリケーション用のClientIDが無いと接続ができません。(原因不明です。不具合か仕様によるものと思われます。)



7.実際のソース(配信用APK)

前回の記事のソースを修正してください。

MainActivity.cs
namespace AppName.Droid
{
    [Activity(Label = "AppName"]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity,
GoogleApiClient.IConnectionCallbacks,
GoogleApiClient.IOnConnectionFailedListener
    {
        public const int RC_SIGN_IN = 9001;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());

            //Google SignIn
            Scope calendarScope = new Scope("https://www.googleapis.com/auth/calendar");
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
                                 .RequestScopes(new Scope(Scopes.Email),
                                                calendarScope)
                                 .RequestEmail()
                                 //.RequestServerAuthCode(serverClientId, false)  //必要なし
                                 //.RequestIdToken(serverClientId) //必要なし
                                 .Build();

            GoogleSignInService.GoogleApiClient = new GoogleApiClient.Builder(this)
                                 .EnableAutoManage(this, this)
                                 .AddApi(PlusClass.API)
                                 .AddScope(calendarScope)
                                 .Build();
        }
        protected override void OnActivityResult(int requestCode, Result resultCode, global::Android.Content.Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);
            if (requestCode == RC_SIGN_IN)
            {
//Google SignIn の認証結果を受け取る
                GoogleSignInResult result = Auth.GoogleSignInApi.GetSignInResultFromIntent(data);
                handleSignInResult(result);   
            }
        }
        private void handleSignInResult(GoogleSignInResult result)
        {
            if (result != null &&
                result.IsSuccess)
            {
                Task.Run(() =>
                {
//メールアドレス・トークンを取得する
                    GoogleSignInAccount account = result.SignInAccount;
                    GoogleSignInService.MailAddress = account.Email;
                    GoogleSignInService.AccessToken = Android.Gms.Auth.GoogleAuthUtil.GetToken(
                                                  Application.Context,
                                                  new Android.Accounts.Account(account.Email, "com.google"),
                                                  "oauth2:" + "https://www.googleapis.com/auth/calendar");
                }).ConfigureAwait(false);
            }
        }
}
}

GoogleSignInServices.cs
public class GoogleSignInService : IGoogleSignInService
{
public static GoogleApiClient GoogleApiClient;
//サインイン
public void SignIn()
{
if (GoogleSignInService.GoogleApiClient != null)
{
Intent signInIntent = Auth.GoogleSignInApi.GetSignInIntent(GoogleSignInService.GoogleApiClient);
((Activity)Forms.Context).StartActivityForResult(signInIntent, MainActivity.RC_SIGN_IN);
}
}
//サインアウト
public void SignOut()
{
if (GoogleSignInService.GoogleApiClient != null &&
GoogleSignInService.GoogleApiClient.IsConnected)
{
Auth.GoogleSignInApi.SignOut(GoogleSignInService.GoogleApiClient);
}
}
//切断処理
public void Disconnect()
{
if (GoogleSignInService.GoogleApiClient != null &&
GoogleSignInService.GoogleApiClient.IsConnected)
{
Auth.GoogleSignInApi.RevokeAccess(GoogleSignInService.GoogleApiClient);
}
}
}

DependencyServiceで呼び出します。使用方法につきましては以前の記事をご確認ください。



当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。