Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 新谷歌登录API-刷新令牌 问题_Android_Google Signin - Fatal编程技术网

Android 新谷歌登录API-刷新令牌 问题

Android 新谷歌登录API-刷新令牌 问题,android,google-signin,Android,Google Signin,我正在尝试使用用于对自己的后端服务器进行身份验证。对我的服务器的每次调用都包含idToken jwt作为承载令牌。在后端,我通过检查签名和令牌是否过期来验证令牌。问题是返回的jwts有1小时的过期时间,但我找不到任何方法来刷新令牌 问题 这是使用我的后端服务器对用户进行身份验证的有效/安全的方法吗 如何在用户不必再次通过登录流的情况下获取新的id令牌 代码 如何获取idToken客户端 fun Application.installAuthentication() { val googleJ

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

问题
  • 这是使用我的后端服务器对用户进行身份验证的有效/安全的方法吗
  • 如何在用户不必再次通过登录流的情况下获取新的id令牌
  • 代码 如何获取idToken客户端

    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))
        }
      }
    }
    
    fun showSignInDialog(){
    val request=getSignInEnterQuest.builder()
    .setServerClientId(谷歌服务器客户端ID)
    .build()
    Identity.getSignInClient(上下文)
    .GetSigningent(请求)
    .addOnSuccessListener{
    googleSignInLauncher.launch(IntentSenderRequest.Builder(it.build())
    }
    }
    fun handleSignInResult(结果:ActivityResult){
    val credential=Identity.getSignInClient(上下文)
    .getSignInCredentialFromIntent(结果.数据)
    //稍后,此令牌将用于在我的后端查询与用户相关的数据
    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))
        }
      }
    }
    
    它没有刷新令牌,不幸的是,我最终使用了old的静默登录功能。我已经测试过,如果我使用用于登录的,旧的将仍然能够执行静默登录


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

    您有任何可以共享的工作示例吗?