ID トークンを使用してバックエンドで認証する

ユーザーが Google アカウントを選択すると、One Tap サインイン クライアントが Google ID トークンを取得します。ID トークンは、ユーザーの ID の署名付きアサーションです。ユーザーの基本的なプロフィール情報も含まれており、Google によって確認されたメールアドレスが含まれている場合もあります。

ID トークンが利用可能な場合は、それを使用してアプリのバックエンドで安全に認証したり、ユーザーのメールアドレスを確認することなく、新しいアカウントにユーザーを自動的に登録したりできます。

ID トークンを使用してユーザーをログインまたは登録するには、トークンをアプリのバックエンドに送信します。バックエンドで、Google API クライアント ライブラリまたは汎用 JWT ライブラリを使用してトークンを検証します。ユーザーがこの Google アカウントでアプリにログインしたことがない場合は、新しいアカウントを作成します。

リプレイ攻撃を回避するためにノンスを使用することを選択した場合は、getNonce を使用して ID トークンとともにバックエンド サーバーに送信し、想定される値を確認します。ユーザーの安全性とセキュリティを向上させるために、ノンスの使用を強くおすすめします。

認証情報オブジェクトから ID トークンを取得する

ユーザーの認証情報を取得したら、認証情報オブジェクトに ID トークンが含まれているかどうかを確認します。存在する場合は、バックエンドに送信します。

Java

public class YourActivity extends AppCompatActivity {

    // ...
    private static final int REQ_ONE_TAP = 2;  // Can be any integer unique to the Activity.
    private boolean showOneTapUI = true;
    // ...

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case REQ_ONE_TAP:
                try { 
                    SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data);
                    String idToken = credential.getGoogleIdToken();
                    if (idToken !=  null) {
                        // Got an ID token from Google. Use it to authenticate
                        // with your backend.
                        Log.d(TAG, "Got ID token.");
                    }
                } catch (ApiException e) {
                    // ...
                }
                break;
        }
    }
}

Kotlin

class YourActivity : AppCompatActivity() {

      // ...
      private val REQ_ONE_TAP = 2  // Can be any integer unique to the Activity
      private var showOneTapUI = true
      // ...

      override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
          super.onActivityResult(requestCode, resultCode, data)

          when (requestCode) {
               REQ_ONE_TAP -> {
                  try { 
                      val credential = oneTapClient.getSignInCredentialFromIntent(data)
                      val idToken = credential.googleIdToken
                      when {
                          idToken != null -> {
                              // Got an ID token from Google. Use it to authenticate
                              // with your backend.
                              Log.d(TAG, "Got ID token.")
                          }
                          else -> {
                              // Shouldn't happen.
                              Log.d(TAG, "No ID token!")
                          }
                      }
                  } catch (e: ApiException) {
                      // ...
              }
          }
      }
      // ...
  }