Google ログインを Android アプリに統合するには、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 を使用してアプリにログインしていません。Google ログイン ボタンを表示するように UI を更新します。
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 トークンをバックエンド サーバーに送信し、サーバーでトークンを検証します。