ウェブ向け Google ログイン JavaScript プラットフォーム ライブラリが廃止されます。このライブラリは、2023 年 3 月 31 日のサポート終了日以降にダウンロードできなくなります。代わりに、ウェブ向けの新しい Google Identity Services を使用してください。
新しく作成されたクライアント ID は、デフォルトで古いプラットフォーム ライブラリを使用できなくなり、既存のクライアント ID は影響を受けません。2022 年 7 月 29 日より前に作成された新しいクライアント ID では、"plugin_name" を設定して Google プラットフォーム ライブラリの使用を有効にすることができます。

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 トークンをバックエンド サーバーに送信し、サーバー上でトークンを検証します。