如何获得离线令牌和刷新令牌以及自动刷新访问Google API



我正在开发一个应用程序,该应用程序使用OAuth2和用于访问Google API的Google客户端库(位于Appengine和GWT BTW上)来访问Google API(从Calendar API开始)。

我已经实现了我的OAuth2Call后台servlet,扩展了GoogleAbstractAppEngineAuthorizationCodeCallbackServlet

我可以使用它,我可以访问并查看日历等,但有两个问题:

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) 我看不出如何设置自动刷新功能。这些页面描述了方法:

  • 类别凭证。建设者
  • 类CredentialStoreRefreshListener

但是我不知道在哪里添加刷新侦听器。与Credential.Builder类不同,GoogleAuthorizationCodeFlow.Builder类中没有这样的方法

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

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

需要注意的一点是:只有当用户明确同意所请求的作用域时,才会返回刷新令牌(除了访问令牌之外)。基本上,当显示审批页面时。所有后续流将只返回一个访问令牌。

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

有关更多信息,请参阅开发人员指南中的脱机访问部分。

要获得刷新令牌,您必须设置accessType=">脱机"和approvalPrompt=">强制"。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新