Android アプリに Google ログインを統合する

Google ログインを Android アプリに統合するには、Google ログインを設定し、ログイン フローを開始するボタンをアプリのレイアウトに追加します。

始める前に

Google API Console プロジェクトを構成し、Android Studio プロジェクトをセットアップします。

Google ログインと GoogleSignInClient オブジェクトを構成する

  1. ログイン アクティビティの 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 を使用して指定します。ユーザー エクスペリエンスを最大限に高めるには、ログイン時に、アプリが最小限の機能を発揮するために必要なスコープのみをリクエストします。追加のスコープは、必要な場合にのみリクエストしてください。これにより、ユーザーは実行したアクションのコンテキストで同意画面を確認できます。追加のスコープをリクエストするをご覧ください。

  2. 次に、ログイン アクティビティの 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.getLastSignedInAccountnull ではなく GoogleSignInAccount オブジェクトを返した場合、ユーザーはすでに Google を使用してアプリにログインしています。それに応じて UI を更新します。つまり、ログイン ボタンを非表示にしたり、メイン アクティビティを開始したり、アプリに適した処理を行います。

GoogleSignIn.getLastSignedInAccountnull を返した場合、ユーザーはまだ Google を使用してアプリにログインしていません。Google ログイン ボタンを表示するように UI を更新します。

Google ログインボタンをアプリに追加する

  1. 標準の Google ログインボタン アプリケーションのレイアウトに SignInButton を追加します。

    <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  2. 省略可: 独自のログインボタン アセットを提供する代わりに、デフォルトのログインボタン グラフィックを使用している場合は、setSize メソッドを使用してボタンのサイズをカスタマイズできます。

    // Set the dimensions of the sign-in button.
    SignInButton signInButton = findViewById(R.id.sign_in_button);
    signInButton.setSize(SignInButton.SIZE_STANDARD);
  3. Android のアクティビティ(onCreate メソッド内のアクティビティなど)で、ボタンの OnClickListener を登録し、ユーザーがボタンをクリックしたときにログインできるようにします。

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

ログインフローを開始する

  1. ログイン アカウント選択ツールの画像 アクティビティの 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 アカウントを選択するようユーザーに求められます。profileemailopenid 以外のスコープをリクエストした場合、ユーザーはリクエストされたリソースへのアクセスを許可するよう求められます。

  2. ユーザーがログインすると、アクティビティの 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 トークンをバックエンド サーバーに送信し、サーバーでトークンを検証します。