使用 ID 權杖透過後端進行驗證

使用者選取 Google 帳戶時,One Tap 登入用戶端會擷取 Google ID 權杖。ID 權杖是使用者身分的簽署斷言,其中還包含使用者的個人資料基本資訊,可能包括經過 Google 驗證的電子郵件地址。

取得 ID 權杖後,您可以使用這些權杖安全地驗證應用程式的後端,或是自動為使用者申請新帳戶,而無需驗證使用者的電子郵件地址。

如要使用 ID 權杖登入或註冊使用者,請將權杖傳送至應用程式的後端。在後端,請使用 Google API 用戶端程式庫或通用 JWT 程式庫驗證權杖。如果使用者未曾使用這個 Google 帳戶登入應用程式,請建立新帳戶。

如果您選擇使用 Nonce 來避免重播攻擊,請使用 getNonce 將 Nonce 和 ID 權杖一併傳送至後端伺服器,並檢查預期值。強烈建議您考慮使用 nonce,以提升使用者安全性。

從憑證物件取得 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) {
                    // ...
            }
        }
    }
    // ...
}