15

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

我已经实现了我的OAuth2Call后台 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 控制台中的设置?

4

3 回答 3

22

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

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

开发者指南的离线访问部分也提供了更多信息。

于 2012-12-10T18:47:12.017 回答
8

要获得刷新令牌,您必须同时设置= accessTypeoffline ”和approvalPrompt=“ force ”。

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
            HTTP_TRANSPORT,
            JSON_FACTORY,
            CLIENT_ID,
            CLIENT_SECRET,  
            SCOPE)
.setAccessType("offline")
.setApprovalPrompt("force")
.build();
于 2013-09-10T14:27:52.177 回答
0

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

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

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

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

于 2013-01-05T20:02:45.613 回答