【问题标题】:Google Oauth2 refresh_token is emptyGoogle Oauth2 refresh_token 为空
【发布时间】:2017-07-18 02:49:55
【问题描述】:

我用字符串做代码请求:

https://accounts.google.com/o/oauth2/v2/auth?
   scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly&
   state={%22externalUserId%22:%22TEST%22}&
   access_type=offline&
   include_granted_scopes=true&
   redirect_uri=http://localhost:3344/oauth2/google/callbackcode&response_type=code&
   client_id=676016849609-r53vpjccpr9kf5uvuul7h6kvek1id2oh.apps.googleusercontent.com

我收到 oauth2 代码。 我使用 java 客户端做令牌请求代码。

private AuthorizationCodeFlow flow;
@PostConstruct
public void init() {
    NetHttpTransport transport = null;
    try {
        transport = GoogleNetHttpTransport.newTrustedTransport();
    } catch (GeneralSecurityException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        flow = new GoogleAuthorizationCodeFlow.Builder(
                transport, JSON_FACTORY, GoogleClientSecrets.load(JSON_FACTORY,
                new InputStreamReader(GoogleCalendarClient.class.getResourceAsStream("/client_secret_676016849609-r53vpjccpr9kf5uvuul7h6kvek1id2oh.apps.googleusercontent.com.json")))
                , SCOPES).build();
    } catch (IOException e) {
        e.printStackTrace();
    }
    callBackPattern = String.format(callBackPattern, provider().lowerCaseName());
}

flow.newTokenRequest(oauthCode)
                .setRedirectUri(callBackPattern)
                .execute();

结果我收到TokenResponse

{
  "access_token": "ya29.Glv_A8Fidn8cRmQveIy0pbDIjcxssKN61X20u4zjlDYV1NbiC-QO593_isRa8Q5ngSFr-y-zICjXw1WZy4OguOh90SCyPnz0NGYpw7I4fahzH7NORQm-bbnA9Chr",
  "expires_in": 3592,
  "id_token": "eyJhbGciOOiZUzI1NiIsImtpZCI6IjgxMDkxNGZiOTk0OGYxZTQzNTdjYzg3MjY4MDg3Mjk4ZTgzNTlkMjAifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiaWF0IjoxNDg4MTg0NDcxLCJleHAiOjE0ODgxODgwNzEsImF0X2hhc2giOiJaVjgxejQwV0pYX3N1WkplazZnem93IiwiYXVkIjoiNjc2MDE2ODQ5NjA5LXI1M3ZwamNjcHI5a2Y1dXZ1dWw3aDZrdmVrMWlkMm9oLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTE4MTk1OTk4MjU4MDIyMzM2MDUwIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF6cCI6IjY3NjAxNjg0OTYwOS1yNTN2cGpjY3ByOWtmNXV2dXVsN2g2a3ZlazFpZDJvaC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImVtYWlsIjoic2VyZ2lpX3ZsYXNpdWtAdWtyLm5ldCJ9.DWkcTAwOPnirsDL_ok10GHjoe0Rg0n-uYYtSfn3tXkIg-xB6taaYi2-gdNCh64-hSzgQWsdeLu7Mga1rXfGVTw-iBPWhU80MhoiH_YZtLpAK7f94rBajqHa8ucei1P7RSZxRD-RdB1YMjpJPQhKx5DV0W9xBPB3LN8s1C3vL-06Y4nu7yB2ZFllG6SIJbl7f0Kn2S_SCAxhxGvwSuIqW4ogXwqc0njdBwWlOvdxn8hQ33dftljn-Q5fJ0iEroLEhUhnGwmGAcr7yl-HRjZQvz6ICyQLvRGDv6J12pEdDu2S0mGZfV_zNLG2-EKqo6xm99WsFSMsV_6_TeCG478f7bQ",
  "token_type": "Bearer"
}

没有错误,因为正确的access_token。问题是TokenResponse 不包含refresh_token 数据。

我怎样才能获得refresh_token

【问题讨论】:

  • 我试过google oauth2 java examples 来接收token,也没有refresh_token

标签: java oauth-2.0 google-oauth


【解决方案1】:

刷新令牌仅在您第一次授权应用程序时发送,然后您需要将其保存在某个位置。所以你必须先删除你从here给你的应用程序的授权,然后再试一次。

您可以在这个问题中获得更多详细信息:Not receiving Google OAuth refresh token

【讨论】:

  • 以下文档:refresh_token 可用于获取新访问令牌的令牌。在用户撤销访问之前,刷新令牌一直有效。同样,仅当您在对 Google 授权服务器的初始请求中将 access_type 参数设置为 offline 时,此字段才会出现在此响应中
  • ..试图删除第一个授权
  • 完全正确。在您的请求中,您设置了 access_type="offline" 以便请求正常。您尝试撤销对您的应用程序的访问权限并再次询问令牌?您需要保存此刷新令牌以使用他获取另一个访问令牌,因为访问令牌仅在小时内有效。
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 2021-12-13
  • 2020-12-09
  • 2014-11-21
  • 1970-01-01
  • 2018-12-18
相关资源
最近更新 更多