我正在尝试使用 New Google Sign-In API 通过我自己的后端服务器进行身份验证。对我的服务器的每次调用都包含 idToken jwt 作为承载令牌。在后端,我通过检查签名并检查令牌是否过期来验证令牌。问题是 New Google Sign-In API 返回 jwts 的过期时间为 1 小时,但我找不到任何刷新令牌的方法。
如何获取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
}
不幸的是,它没有刷新令牌
我最终使用了旧的 GoogleSignInApi 的静默登录功能。我已经测试过了,如果我使用 New Google Sign In api 进行登录,旧的 API 仍然能够执行静默登录。
如果新的 API 具有这种静默登录功能,那就太好了,但现在看来,如果你想要这个“刷新”功能,你仍然需要使用旧的 api。
默认情况下,访问令牌的有效期为 1 小时,这似乎足以授权检索登录用户的数据。一旦令牌通过后端服务器验证,就必须在后端为用户建立会话。用户登录后每次进入应用程序时,无需重复获取访问令牌。访问令牌的主要目的是通过 Google 服务器验证用户。