【问题标题】:Getting null Refresh token获取空刷新令牌
【发布时间】:2012-05-04 20:47:20
【问题描述】:

我正在使用 google-api-java-client 版本 1.8-beta 对 Google 帐户进行 oAuth2 身份验证。一切都很好,直到我得到具有访问令牌但没有刷新令牌的 GoogleTokenResponse 对象。 要构建请求 url,我使用以下方法:

...
    googleAuthenticationUrl = new GoogleAuthorizationCodeRequestUrl(CLIENT_ID, callBackUrl, scopes).build();
...

在获取请求令牌时,我将其与此行中的访问令牌交换:

...
GoogleTokenResponse tokenResponse =  new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(), new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, request.getParameter(CODE_URL_PARAM), callBackUrl).execute();
...

返回的 GoogleTokenResponse 对象不包含刷新令牌:

{"access_token":"ya29.AH..etc...9-Y","expires_in":3600,"token_type":"Bearer"}

你能解释一下这个问题吗?非常感谢您的帮助!

【问题讨论】:

    标签: oauth google-api google-api-java-client


    【解决方案1】:

    在构建请求Url时,你应该设置访问类型:

    requestUrl = new GoogleAuthorizationCodeRequestUrl(googleClientId, callBackUrl, scopes)
        .setApprovalPrompt("force") // needed if user already granted permission
        .setAccessType("offline")
        .build();
    

    page 中所述,建议设置此参数:

    [...] 我们建议您明确设置 access_type 参数 到离线,因为我们预计当在线价值是 引入后,它将作为默认行为。这可能导致 应用程序中的意外更改,因为它会影响方式 允许您的应用程序刷新访问令牌。经过 将参数值显式设置为离线,您可以避免任何 应用程序功能的变化。 [...]

    【讨论】:

    • 在 GoogleAuthorizationCodeFlow.Builder 中:升级警告:在 1.10 版之前,默认值为 {@code "offline"}。但是,从 1.10 版开始,它是 {@code null},这意味着 {@code "online"} 用于 Web 应用程序。要保持先前的行为,您需要显式调用 {@code setAccessType("offline")}。
    • 如果你(PapelPincel)写的(取自谷歌开发者页面)是正确的,我会说这不足以“在令牌过期之前自动刷新令牌”(如developers.google.com/oauthplayground 所说) .那么如何在后台刷新访问令牌而不要求用户进行新的授权?
    【解决方案2】:

    对于从谷歌搜索到这里的任何人,我没有使用纯服务器端流程,因此通过 javascript 获取授权令牌,如doc,@PapelPincel 答案对我来说是一个提示。

    您应该将 data-accesstype="offline" 添加到您的按钮,如下面的 sn-p 所示:

    例子:

              <span
                data-accesstype="offline"
                class="g-signin"
                data-callback="signinCallback"
                data-clientid="CLIENT_ID"
                data-redirecturi="postmessage"
                data-cookiepolicy="single_host_origin"
                data-requestvisibleactions="http://schemas.google.com/AddActivity"
                data-scope="https://www.googleapis.com/auth/plus.login">
              </span>
    

    【讨论】:

      【解决方案3】:

      除了 PapelPincel 的回答,我还必须使用 .Net 强制批准提示 发布 1.8.1.970 以获取刷新令牌。例如

      var authReq = new GoogleAuthorizationCodeRequestUrl(new Uri(GoogleAuthConsts.AuthorizationUrl)) { 
          RedirectUri = Callback, 
          ClientId = ClientId, 
          AccessType = "offline", 
          Scope = string.Join(" ", new[] { Scopes... }), 
          ApprovalPrompt = "force" 
      }; 
      

      【讨论】:

        猜你喜欢
        • 2012-06-29
        • 1970-01-01
        • 2019-10-26
        • 2020-09-25
        • 2012-02-15
        • 1970-01-01
        • 2021-01-18
        • 1970-01-01
        • 2022-12-14
        相关资源
        最近更新 更多