使用 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) {
                      // ...
              }
          }
      }
      // ...
  }