新的 Google 登录 API - 刷新令牌

问题描述 投票:0回答:2

问题

我正在尝试使用 New Google Sign-In API 通过我自己的后端服务器进行身份验证。对我的服务器的每次调用都包含 idToken jwt 作为承载令牌。在后端,我通过检查签名并检查令牌是否过期来验证令牌。问题是 New Google Sign-In API 返回 jwts 的过期时间为 1 小时,但我找不到任何刷新令牌的方法。

问题

  1. 这是通过我的后端服务器对用户进行身份验证的有效/安全方法吗?
  2. 如何获取新的 ID 令牌,而用户无需再次执行登录流程?

代码

如何获取idToken客户端

fun showSignInDialog() {
  val request = GetSignInIntentRequest.builder()
    .setServerClientId(GOOGLE_SERVER_CLIENT_ID)
    .build()

  Identity.getSignInClient(context)
    .getSignInIntent(request)
    .addOnSuccessListener {
      googleSignInLauncher.launch(IntentSenderRequest.Builder(it).build())
    }
}

fun handleSignInResult(result: ActivityResult) {
  val credential = Identity.getSignInClient(context)
    .getSignInCredentialFromIntent(result.data)

  // later this token will be used for querying user-related data on my backend
  setToken(credential.googleIdToken)
}

如何在后端验证我的端点

fun Application.installAuthentication() {
  val googleJwtIssuer = environment.config.property("jwt.google.domain").getString()
  val googleJwtAudience = environment.config.property("jwt.google.audience").getString()
  val jwtRealm = environment.config.property("jwt.google.realm").getString()
  val googleJwkProvider = JwkProviderBuilder(URL("https://www.googleapis.com/oauth2/v3/certs"))
    .cached(10, 24, TimeUnit.HOURS)
    .rateLimited(10, 1, TimeUnit.MINUTES)
    .build()
  install(Authentication) {
    jwt("google") {
      verifier(googleJwkProvider) {
        withIssuer(googleJwtIssuer)
        withAudience(googleJwtAudience)
      }
      realm = jwtRealm
      validate { credentials ->
        if (credentials.payload.audience.contains(googleJwtAudience))
          JWTPrincipal(credentials.payload)
        else
          null
      }
    }
  }
}

// in my main
installAuthentication()
routing {
  authenticate("google") {
    get("/get-todos") {
      val payload = call.principal<JWTPrincipal>()?.payload ?: error("JWTPrincipal not found")
      
      call.respond(getTodos(payload.subject))
    }
  }
}

编辑

Google 登录 API 返回的示例 JWT(首次登录时)

{
  "iss": "https://accounts.google.com",
  "azp": "secret",
  "aud": "secret",
  "sub": "secret",
  "email": "[email protected]",
  "email_verified": true,
  "name": "Ben Jerry",
  "picture": "https://lh3.googleusercontent.com/secret",
  "given_name": "Patrik",
  "family_name": "Aradi",
  "locale": "en-GB",
  "iat": 1616243551,
  "exp": 1616247151
}

不幸的是,它没有刷新令牌

android google-signin
2个回答
1
投票

我最终使用了旧的 GoogleSignInApi 的静默登录功能。我已经测试过了,如果我使用 New Google Sign In api 进行登录,旧的 API 仍然能够执行静默登录。

如果新的 API 具有这种静默登录功能,那就太好了,但现在看来,如果你想要这个“刷新”功能,你仍然需要使用旧的 api。


0
投票

默认情况下,访问令牌的有效期为 1 小时,这似乎足以授权检索登录用户的数据。一旦令牌通过后端服务器验证,就必须在后端为用户建立会话。用户登录后每次进入应用程序时,无需重复获取访问令牌。访问令牌的主要目的是通过 Google 服务器验证用户。

© www.soinside.com 2019 - 2024. All rights reserved.