- この記事は、Google Sign-In for Android に関する記事を和訳したものです。
- 原文: Integrating Google Sign-In into Your Android App
- 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
- 自己責任でご利用ください。
- 和訳した時期は 2019年6月ころです。
あなたの Androidアプリに Googleサインインを統合するには、Googleサインインを構成し、サインインフローを開始するボタンをあなたのアプリのレイアウトに追加します。
始める前に
Google API Consoleプロジェクトを構成し、あなたの Android Studioプロジェクトをセットアップします。
Googleサインイン、および、GoogleSignInClientオブジェクトを構成する
-
あなたのサインインアクティビティの
onCreate
メソッドにて、あなたのアプリによって必要とされるユーザデータをリクエストするために、Googleサインインを構成します。 例えば、ユーザの ID、および基本的なプロフィール情報をリクエストする Googleサインインを構成するには、DEFAULT_SIGN_IN
パラメータを用いてGoogleSignInOptions
オブジェクトを作成します。 ユーザの電子メールアドレスをリクエストするには、同様に、requestEmail
オプションを用いてGoogleSignInOptions
オブジェクトを作成します。// Configure sign-in to request the user's ID, email address, and basic // profile. ID and basic profile are included in DEFAULT_SIGN_IN. GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build();
もし Google APIにアクセスするための追加のスコープをリクエストする必要があるならば、
requestScopes
を用いてそれらを指定します。 最高のユーザエクスペリエンスのため、サインイン時には、あなたのアプリが最低限機能するために必要とされるスコープのみをリクエストします。 必要とするときのみ追加のスコープをリクエストします、そうすれば、あなたのユーザには、彼らが実行したアクションのコンテキストにて同意画面が表示されます。 追加のスコープをリクエストするを参照してください。 -
それから、あなたのサインインアクティビティの
onCreate
メソッドにて、指定したオプションを用いてGoogleSignInClient
オブジェクトを作成します。// Build a GoogleSignInClient with the options specified by gso. mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
既存のユーザのサインをチェックする
あなたのアクティビティの onStart
メソッドにて、ユーザが、既に Googleを用いてあなたのアプリにサインインしているかどうかをチェックします。
// Check for existing Google Sign In account, if the user is already signed in // the GoogleSignInAccount will be non-null. GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); updateUI(account);
もし GoogleSignIn.getLastSignedInAccount
が (null
ではなく) GoogleSignInAccount
オブジェクトを返すならば、ユーザは、既に Googleを用いてあなたのアプリにサインインしています。
あなたの UIをそれに応じて更新します —
つまり、サインインボタンを非表示にする、あなたのメインアクティビティを起動する、あるいは、あなたのアプリに適切なものは何でもです。
もし GoogleSignIn.getLastSignedInAccount
が null
を返したならば、ユーザは、まだ Googleを用いてあなたのアプリにサインインしていません。
あなたの UIに Googleサインインボタンを表示するよう更新します。
あなたのアプリに Googleサインインボタンを追加する
-
あなたのアプリケーションのレイアウトに
SignInButton
を追加します:<com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content" />
-
オプション: もし、独自のサインインボタンのアセットを提供する代わりにデフォルトのサインインボタンのグラフィックスを使用しているならば、
setSize
メソッドを用いてボタンのサイズをカスタマイズすることができます。// Set the dimensions of the sign-in button. SignInButton signInButton = findViewById(R.id.sign_in_button); signInButton.setSize(SignInButton.SIZE_STANDARD);
-
Androidアクティビティにて(例えば、
onCreate
メソッドにて)、クリックしたときにユーザをサインインさせるために、あなたのボタンのOnClickListener
を登録します:findViewById(R.id.sign_in_button).setOnClickListener(this);
サインインフローを開始する
-
アクティビティの
onClick
メソッドにて、getSignInIntent
メソッドを用いてサインインインテントを作成することによって、サインインボタンのタップを処理します、そして、startActivityForResult
を用いてインテントを開始します。@Override public void onClick(View v) { switch (v.getId()) { case R.id.sign_in_button: signIn(); break; // ... } }
private void signIn() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); }
インテントを開始すると、ユーザに、サインインに用いる Googleアカウントを選択するよう促します。 もし
profile
、email
、およびopenid
以外のスコープをリクエストしたならば、ユーザは、リクエストされたリソースにアクセス権を付与することも求められます。 -
ユーザがサインインした後、アクティビティの
onActivityResult
メソッドにて、ユーザのためのGoogleSignInAccount
オブジェクトを取得することができます。@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...); if (requestCode == RC_SIGN_IN) { // The Task returned from this call is always completed, no need to attach // a listener. Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); handleSignInResult(task); } }
GoogleSignInAccount
オブジェクトは、ユーザ名といった、サインインしたユーザについての情報を含んでいます。private void handleSignInResult(Task<GoogleSignInAccount> completedTask) { try { GoogleSignInAccount account = completedTask.getResult(ApiException.class); // Signed in successfully, show authenticated UI. updateUI(account); } catch (ApiException e) { // The ApiException status code indicates the detailed failure reason. // Please refer to the GoogleSignInStatusCodes class reference for more information. Log.w(TAG, "signInResult:failed code=" + e.getStatusCode()); updateUI(null); } }
getEmail
を用いてユーザの電子メールアドレスを、getId
を用いてユーザの Google ID(クライアント側で使用するため)を、getIdToken
を用いてユーザの IDトークンを取得することもできます。 もし、現在サインインしているユーザをバックエンドサーバに渡す必要があるならば、IDトークンをあなたのバックエンドサーバに送信し、サーバ上のトークンを検証します。