GoogleAuthUtil と Plus.API から移行する

以前に GoogleAuthUtil.getToken または Plus.API の場合は、最新のバージョンに移行する必要があります セキュリティとユーザー エクスペリエンスを向上させる Sign-In API。

アクセス トークンのアンチパターンから移行する

GoogleAuthUtil.getToken で取得したアクセス トークンを バックエンド サーバーを ID アサーションとして使用することはできません。これは、 トークンがバックエンドに発行されたことを認識し、挿入に対して脆弱な状態を 認証情報を取得できます。

たとえば、下記の例のような Android コードの場合、 アプリを現在のベスト プラクティスに移行する。

Android コード

この例では、アクセス トークン リクエストで oauth2: とスコープ文字列が値として GoogleAuthUtil.getToken 呼び出しの scope パラメータ (oauth2:https://www.googleapis.com/auth/plus.login)。

認証には、Google Cloud API で取得したアクセス トークン GoogleAuthUtil.getToken の場合は、ID トークンフローまたは認証コードフローを使用します。

ID トークンのフローに移行する

ユーザーの ID、メールアドレス、名前、プロフィール写真の URL があれば十分です。 ID トークンのフローを使用します。

ID トークンのフローに移行するには、次の変更を行います。

Android クライアントサイド

  • リクエストする場合は、GET_ACCOUNTS(連絡先)権限を削除する
  • GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()、または AccountManager.newChooseAccountIntent() から Auth.GOOGLE_SIGN_IN_API に変更: GoogleSignInOptions.Builder.requestIdToken(...) の構成。

サーバーサイド

  • ID トークン認証用の新しいエンドポイントを作成します。
  • クライアント アプリの移行後に古いエンドポイントをオフにする

サーバー認証コードフローに移行する

サーバーが他の Google API(Google ドライブ、YouTube、 サーバー認証コードフローを使用します。

サーバー認証コードフローに移行するには、次の変更を行います。

Android クライアントサイド

  • リクエストする場合は、GET_ACCOUNTS(連絡先)権限を削除する
  • GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()、または AccountManager.newChooseAccountIntent() から Auth.GOOGLE_SIGN_IN_API に変更: GoogleSignInOptions.Builder.requestServerAuthCode(...) の構成。

サーバーサイド

引き続き、古いエンドポイントと新しいエンドポイントの間で API アクセス ロジックを共有できます。次に例を示します。

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...);
String accessToken = tokenResponse.getAccessToken();
String refreshToken = tokenResponse.getRefreshToken();
Long expiresInSeconds = tokenResponse.getExpiresInSeconds();

// Shared by your old and new implementation, old endpoint can pass null for refreshToken
private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) {
   GoogleCredential credential = new GoogleCredential.Builder()
           .setTransPort(...)
           ...
           .build();
   credential.setAccessToken(accessToken);
   credential.setExpiresInSeconds(expiresInSeconds);
   credential.setRefreshToken(refreshToken);
}

GoogleAuthUtil ID トークンのフローから移行する

GoogleAuthUtil を使用して ID トークンを取得する場合は、新しい Sign-In API の ID トークンフロー

たとえば、Android コードが次の例のような場合、 migrate:

Android コード

この例では、ID トークン リクエストで audience:server:client_id と 「scope」パラメータとして、ウェブサーバーのクライアント ID を GoogleAuthUtil.getToken 件の通話 (audience:server:client_id:9414861317621.apps.googleusercontent.com)。

新しい Sign-In API ID トークンのフローには、次のようなメリットがあります。

  • 合理化されたワンタップ ログイン エクスペリエンス
  • 追加のネットワーク呼び出しを行わなくても、サーバーがユーザー プロフィール情報を取得できる

ID トークンのフローに移行するには、次の変更を行います。

Android クライアントサイド

  • リクエストする場合は、GET_ACCOUNTS(連絡先)権限を削除する
  • GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()、または AccountManager.newChooseAccountIntent() から Auth.GOOGLE_SIGN_IN_API に変更: GoogleSignInOptions.Builder.requestIdToken(...) の構成。

サーバーサイド

新しい Sign-In API は、OpenID Connect に準拠した ID トークンを発行します。 非推奨の形式を使用する GoogleAuthUtil.getToken とは異なります。 具体的には、発行者は現在 https://accounts.google.com で、https になっています。 説明します。

移行プロセス中に、サーバーは両方の ID トークンを検証する必要があります。 更新することもできます。両方の形式のトークンを検証するには、 (使用しているクライアント ライブラリに応じて)変更する方法を説明します。

  • Java(Google API クライアント ライブラリ): 1.21.0 以降にアップグレード
  • PHP(Google API クライアント ライブラリ): v1 を使用している場合は、1.1.6 以降にアップグレードします。 v2 を使用している場合は、2.0.0-RC1 以降にアップグレードしてください
  • Node.js: 0.9.7 以降にアップグレードする
  • Python または独自の実装: 次の両方の発行元を受け入れます。 https://accounts.google.com および accounts.google.com

GoogleAuthUtil サーバー認証コードフローから移行する

GoogleAuthUtil を使用してサーバー認証コードを取得する場合は、 新しい Sign-In API 認証コードフローを導入しました。

たとえば、Android コードが次の例のような場合、 migrate:

Android コード

この例では、サーバーの認証コード リクエストには、oauth2:server:client_id と クライアント ID をウェブサーバーの scope パラメータとして GoogleAuthUtil.getToken 件の通話(oauth2:server:client_id:9414861317621.apps.googleusercontent.com)。

新しい Sign-In API 認可コードフローには、次のような利点があります。

  • 合理化されたワンタップ ログイン エクスペリエンス
  • 以下の移行ガイドに沿って操作すると、サーバーは ID トークンを取得できます (認証コードの交換を行う際、ユーザーのプロフィール情報を含む)

新しい認証コードフローに移行するには、次の変更を行います。

Android クライアントサイド

  • リクエストする場合は、GET_ACCOUNTS(連絡先)権限を削除する
  • GoogleAuthUtilPlus.APIAccountPicker.newChooseAccountIntent()、または AccountManager.newChooseAccountIntent() から Auth.GOOGLE_SIGN_IN_API に変更: GoogleSignInOptions.Builder.requestServerAuthCode(...) の構成。

サーバーサイド

現在のコードを維持し、https://oauth2.googleapis.com/token を指定する トークン サーバーのエンドポイントとして、 GoogleAuthorizationCodeTokenRequest オブジェクトを使用して ID トークンを取得できるようにする ユーザーのメール、ユーザー ID、プロフィール情報が自動的に設定されます。別の認証情報を入力する必要はありません。 通信できます。このエンドポイントには完全な下位互換性があります。次のコードは、 以前の Android デバイスと新しい Android デバイスの両方から取得したサーバー認証コードで使用できます。 実装します。

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
                transport,
                jsonFactory,
                // Use below for tokenServerEncodedUrl parameter
                "https://oauth2.googleapis.com/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode,
                REDIRECT_URI)
               .execute();

...

// You can also get an ID token from auth code exchange.
GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(SERVER_CLIENT_ID))
        .setIssuer("https://accounts.google.com")
        .build();
// Refer to ID token documentation to see how to get data from idToken object.
GoogleIdToken idToken = verifier.verify(idTokenString);
...