【问题标题】:How to get offline token and refresh token and auto-refresh access to Google API如何获取离线令牌和刷新令牌以及自动刷新对 Google API 的访问权限
【发布时间】:2012-11-26 12:03:22
【问题描述】:

我正在开发一个使用 OAuth2 访问 Google API(从日历 API 开始)的应用程序和用于该应用程序的谷歌客户端库(在 Appengine 和 GWT BTW 上)。​​

我已经实现了我的OAuth2Call back servlet,扩展了 Google AbstractAppEngineAuthorizationCodeCallbackServlet

我可以正常工作,我可以访问并可以查看日历等,但有两个问题:

1) 尽管明确请求离线访问,但我没有获得刷新令牌:

public static GoogleAuthorizationCodeFlow newFlow( String scope ) throws IOException {
    GoogleAuthorizationCodeFlow.Builder builder = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT, 
            JSON_FACTORY,
            getClientSecrets(), 
            Collections.singleton( scope ) );

    builder.setCredentialStore( new AppEngineCredentialStore() ).setAccessType("offline");

    return builder.build();
}

2) 我看不到如何设置自动刷新功能。 这些页面描述了这些方法:

但我看不到在哪里添加刷新侦听器。 GoogleAuthorizationCodeFlow.Builder 类中没有这种方法,不像Credential.Builder

编辑 在更多地调试代码之后,当凭证返回时(在onSuccess() 方法中)它似乎已经设置了RefreshListener .....所以也许这是他们的默认设置,我唯一的问题是我不是得到refresh_token,尽管要求它。

也许还需要查看 Google API 控制台中的设置?

【问题讨论】:

    标签: java google-app-engine oauth-2.0 google-api


    【解决方案1】:

    您应该注意的一件事:仅当用户明确同意所请求的范围时,才会返回刷新令牌(除了访问令牌之外)。基本上,当显示批准页面时。所有后续流程都只会返回一个访问令牌。

    现在,为了测试您的应用程序并确保您第一次收到刷新令牌,您可以使用approval_prompt=force 参数(builder.setApprovalPrompt("force")) 来确保审批页面显示在流程中并且您获得用户的明确同意。在您解决任何问题并确保正确存储刷新令牌后,您可以删除该标志(默认为 auto

    更多信息也可以在开发者指南中的offline access section 中找到。

    【讨论】:

    • 感谢您的评论,我会检查这些方面。目前,我明确撤销了令牌,然后再次请求它,我总是通过用户的明确接受屏幕 - 但仍然没有获得 refresh_token。
    • vlatko,我正在做你所说的一切除了提示力量,这似乎已经解决了!所以,非常感谢您的回答!这是一个错误,还是只是(过于广泛的......)文档中的明显遗漏?
    【解决方案2】:

    要获得 刷新令牌,您必须设置 both accessType = "offline" 和 approvalPrompt = "强制”。

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT,
                JSON_FACTORY,
                CLIENT_ID,
                CLIENT_SECRET,  
                SCOPE)
    .setAccessType("offline")
    .setApprovalPrompt("force")
    .build();
    

    【讨论】:

    • 好的,谢谢! .setApprovalPrompt(..) 必须是一个相对较新的要求。大约一两个月前,我的代码在没有这个选项的情况下工作,它给了我刷新令牌。突然间它停止工作了,我不知道为什么。
    【解决方案3】:

    我对此进行了调查,并得出结论,access_token 只需要使用一次。也就是说,每个 Google 查询都是一个两步过程:

    1. 使用 refresh_token 生成临时 access_token
    2. 将 access_token 用于您的操作所需的一个或多个查询。

    我在这里看到了几篇关于确保服务器时钟同步的帖子。但这似乎是不必要的复杂性。

    更详细的解释:http://www.tqis.com/eloquency/googlecalendar.htm

    【讨论】:

    • 谢谢桑尼。但问题是,在第一次授权时,我得到的是 AccessToken,而不是 RefreshToken,尽管通过将 AccessType 设置为“离线”来要求它。如果您使用 Google 类(一旦您拥有 RefreshToken),它们将存储它并使用它在过期时自动获取新的 AccessToken,这一切对您来说都是透明的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2016-11-22
    • 2014-07-15
    • 2019-06-29
    • 2021-04-12
    • 2016-03-13
    • 2016-10-13
    相关资源
    最近更新 更多