【问题标题】:How to get refreshToken when using GoogleAuthUtil使用 Google Auth Util 时如何获取刷新令牌
【发布时间】:2023-03-31 14:07:01
【问题描述】:

我在 Android 上的 Google Play Services 中使用 GoogleAuthUtil。调用GoogleAuthUtil.getToken(context, userName, scope)后,得到了这样的token:

ya29.wQBWztab5kcgMLcMbAI0LwFzHC_DPrxauSWbX4P6KOnBEOgjcm9V7OI9AFr6JGxDY54gP00RemzzgML56_gWRHn8Q5jK16BLY-0y83Gc5vfe3xN-QpyM4d7z

这是一个access_token,可用于调用Google API。那么,我怎样才能获得一个刷新令牌来刷新这个access_token,因为我在我的Android项目中也使用了Google oauth java libraryYouTube Java Library,我想使用这两个库来维护/​​管理access_tokenrefresh tokenexpires_in 值。 (使用谷歌oauth java库时,返回的TokenResponse包含access_tokenrefresh tokenexpires_in

提前致谢。

【问题讨论】:

    标签: android oauth google-play-services youtube-data-api


    【解决方案1】:

    您无法使用 GoogleAuthUtil.getToken() 直接获取 refreshToken,但如果您每次收到 401 错误时调用 getToken(),GoogleAuthUtil 会在需要时返回一个新的有效令牌。

    【讨论】:

    • 您能详细说明一下吗?也许是有关如何处理此问题的有用链接?
    • 抱歉,我不记得关于这个的细节了:-/。我记得我在寻找一种方法来获取 refresh_token 但没有找到,所以我只调用了getToken,如下所述:developers.google.com/android/guides/http-auth
    【解决方案2】:

    为了获得刷新令牌,请确保您的范围采用以下格式:

    Account account = new Account(mEmail, GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
    mScope="oauth2:server:client_id:"+ OAUTH_WEBCOMPONENT_ID+":api_scope:"+"https://www.googleapis.com/auth/userinfo.email";
    return GoogleAuthUtil.getToken(mActivity, account, mScope);
    

    这会给你一个授权码,可以发送到你的网络组件。

    您的 web 组件只能使用此授权代码一次来获取访问令牌并使用此代码刷新令牌。您必须将刷新令牌保存在数据库中,以便当访问代码不再有效时,您可以在需要时获取新的访问令牌。

    POST /oauth2/v3/token HTTP/1.1
    Host: www.googleapis.com
    Content-length: 233
    content-type: application/x-www-form-urlencoded
    user-agent: google-oauth-playground
    
    code=4%2FVL2YMuPMheOP2-0vyKBSfGd-4er5GsMY17Ecp8ITK4U&redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground&client_id=407408718192.apps.googleusercontent.com&client_secret=************&scope=&grant_type=authorization_code
    

    您可以在此处模拟其工作原理:

    https://developers.google.com/oauthplayground/

    【讨论】:

      【解决方案3】:

      调用requestServerAuthCode(String, true) 而不是requestServerAuthCode(String) 会强制请求在成功时包含一个refresh_token。

      https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder.html#requestServerAuthCode(java.lang.String,布尔值)

      val task = GoogleSignIn.getSignedInAccountFromIntent(data);
      task.addOnSuccessListener {
      
      val account = task.getResult(ApiException::class.java)
      val authCode = account!!.serverAuthCode
      
      // Send authcode to server to exchange access and refresh tokens.
      exchangeAuthCodeForAccessToken(authCode)
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-24
        • 2018-02-27
        • 2022-06-19
        • 1970-01-01
        • 2022-12-03
        • 2014-11-07
        • 2018-07-18
        • 2015-11-26
        相关资源
        最近更新 更多