使用 ID 令牌通过后端进行身份验证

当用户选择 Google 账号时,一键登录客户端会检索 Google ID 令牌。ID 令牌是用户身份的已签名断言,其中还包含用户的基本个人资料信息,可能包括已通过 Google 验证的电子邮件地址。

当 ID 令牌可用时,您可以使用它们通过应用的后端进行安全身份验证,或自动为用户注册新账号,而无需验证用户的电子邮件地址。

如需使用 ID 令牌登录或注册用户,请将令牌发送到应用的后端。在后端,使用 Google API 客户端库或通用 JWT 库验证令牌。如果用户之前未使用此 Google 账号登录您的应用,请创建一个新账号。

如果您选择使用随机数来帮助避免重放攻击,请使用 getNonce 将随机数与 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) {
                    // ...
            }
        }
    }
    // ...
}