Oauth 2.0 正在获取Gmail API访问和ID令牌,但刷新令牌为空

Oauth 2.0 正在获取Gmail API访问和ID令牌,但刷新令牌为空,oauth-2.0,google-oauth,gmail-api,Oauth 2.0,Google Oauth,Gmail Api,在从JavaScript获取授权代码并将其传递到服务器端之后,我们确实获得了一个访问令牌(和一个ID令牌),但不是所需的刷新令牌 周围有很多帖子,但还不能解决 有没有关于如何获取刷新令牌的建议 谢谢 private String getResponseToken(GoogleClientSecrets clientSecrets, String authCode) throws IOExce

在从JavaScript获取授权代码并将其传递到服务器端之后,我们确实获得了一个访问令牌(和一个ID令牌),但不是所需的刷新令牌

周围有很多帖子,但还不能解决

有没有关于如何获取刷新令牌的建议

谢谢

    private String getResponseToken(GoogleClientSecrets clientSecrets,
                                                 String authCode) throws IOException {
        try {
            GoogleTokenResponse tokenResponse =
                    new GoogleAuthorizationCodeTokenRequest(
                            new NetHttpTransport(),
                            JacksonFactory.getDefaultInstance(),
                            "https://www.googleapis.com/oauth2/v4/token",
//                        "https://accounts.google.com/o/oauth2/token",
                            clientSecrets.getDetails().getClientId(),
                            clientSecrets.getDetails().getClientSecret(),

                            authCode, //NOTE: was received from JavaScript client

                            "postmessage" //TODO: what's this? 
                            ).execute();
            String accessToken = tokenResponse.getAccessToken();
            String idToken = tokenResponse.getIdToken();

            //TODO: not getting a refresh token... why?!
            String refreshToken = tokenResponse.getRefreshToken();
            Boolean hasRefreshToken = new Boolean(!(refreshToken == null));
            LOGGER.warn("received refresh token: {}", hasRefreshToken);

            LOGGER.debug("accessToken: {}, refreshToken: {}, idToken: {}", accessToken, refreshToken, idToken);
            return accessToken;
        }catch (TokenResponseException tre){...}

Gmail API仅在您第一次请求用户权限时提供刷新令牌。(至少在我身上是这样的)


转到:,删除应用程序的授权并运行代码。您应该会收到刷新令牌。

Gmail API仅在您第一次请求用户权限时提供刷新令牌。(至少在我身上是这样的)

转到:,删除应用程序的授权并运行代码。您应该收到刷新令牌。

您应该添加

  • AccessType=“脱机”
  • 你需要调用这个函数

    new GoogleAuthorizationCodeRequestUrl(...).setAccessType("offline") 
    
    或其他语法:

    var authReq = new GoogleAuthorizationCodeRequestUrl(new Uri(GoogleAuthConsts.AuthorizationUrl)) { 
        RedirectUri = Callback, 
        ClientId = ClientId, 
        AccessType = "offline", 
        Scope = string.Join(" ", new[] { Scopes... }), 
        ApprovalPrompt = "force" 
    };
    
    在Fiddler中,您应该看到以下请求:

    访问类型=离线

    另见

    有关setAccessType的更多详细信息,请参见

    您应该添加

  • AccessType=“脱机”
  • 你需要调用这个函数

    new GoogleAuthorizationCodeRequestUrl(...).setAccessType("offline") 
    
    或其他语法:

    var authReq = new GoogleAuthorizationCodeRequestUrl(new Uri(GoogleAuthConsts.AuthorizationUrl)) { 
        RedirectUri = Callback, 
        ClientId = ClientId, 
        AccessType = "offline", 
        Scope = string.Join(" ", new[] { Scopes... }), 
        ApprovalPrompt = "force" 
    };
    
    在Fiddler中,您应该看到以下请求:

    访问类型=离线

    另见


    有关setAccessType的更多详细信息,请参见

    在找到如何在后端使用Google API后(文档有点不完整…),通过调整参数在前端解决了该问题:

    格兰特弗林塞斯酒店({ -提示:“选择帐户” +提示:“同意”


    HTH

    在找到如何在后端使用Google API(文档有点不完整)后,通过调整参数在前端解决了这个问题:

    格兰特弗林塞斯酒店({ -提示:“选择帐户” +提示:“同意”


    HTH

    的可能重复项看起来不像重复项。实际上,在这篇文章中寻找完成的第一步:“我已经完成了授权步骤,并获得了访问令牌和刷新令牌。”。这就是我们需要的:获取刷新令牌。其他人在文章底部注意到,他是在PHP中使用$client->setAccessType(“offline”);)获取的。问题是如何使用Java API获取初始刷新令牌?的可能重复项看起来不像重复项。实际上,在本文中查找完成的第一步:“我已经完成了授权步骤,并获得了访问令牌和刷新令牌。”。这就是我们需要的:获取刷新令牌。其他人在帖子底部指出,他是用PHP通过$client->setAccessType(“offline”);获得的。)。问题是如何使用Java API获取初始刷新令牌?Hi Ricardo,谢谢,但似乎无法解决问题。删除应用程序授权将使权限提示再次显示给用户,但结果(未获取刷新令牌)保持不变。Hi Ricardo,谢谢,但似乎无法解决问题。删除应用程序授权将再次向用户显示权限提示,但结果(未获得刷新令牌)保持不变。将访问类型设置为脱机工作,但我必须按照Ricardo Gómez所说的操作,也必须按照Ricardo Gómez所说的操作