如何获取脱机令牌和刷新令牌以及自动刷新对Google API的访问权限
我正在开发一个应用程序,使用OAuth2和谷歌客户端库(在Appengine和GWT BTW上)访问Google API(从Calendar 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)我看不到如何设置自动刷新function。 这些页面描述了这些方法:
- 类Credential.Builder
- 类CredentialStoreRefreshListener
但我无法看到添加刷新侦听器的位置。 与Credential.Builder
类不同, GoogleAuthorizationCodeFlow.Builder
类中没有这样的方法
编辑更多调试代码后,当凭证返回时(在onSuccess()
方法中)它似乎已经设置了一个RefreshListener
…..所以也许这是他们默认的,我唯一的问题是我没有得到一个refresh_token
,尽管要求它。
可能还需要在Google API控制台中查看设置吗?
您应该注意的一件事是:只有当用户明确同意所请求的范围时,才会返回刷新令牌(除了访问令牌)。 基本上,当显示批准页面时。 所有后续流程仅返回访问令牌。
现在,为了测试您的应用程序并确保第一次收到刷新令牌,您可以使用approval_prompt = force参数( builder.setApprovalPrompt("force")
)来确保批准页面显示在流程中并获得用户的明确同意。 在排除任何问题并确保正确存储刷新令牌后,您可以删除该标志(默认为auto
)
更多信息也可在开发人员指南的离线访问部分中找到。
要获取刷新令牌,您必须同时设置accessType =“offline”和approvalPrompt =“force”。
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, SCOPE).setAccessType("offline").setApprovalPrompt("force").build();
我调查了这一点,并得出结论,access_token只需要使用一次。 也就是说,每个Google查询都是一个两步过程:
- 使用refresh_token生成临时access_token
- 使用access_token进行操作所需的一个或多个查询。
我在这里看到了几个关于确保服务器时钟同步的post。 但这似乎是不必要的复杂性。
有关更详细的说明,请访问: http : //www.tqis.com/eloquency/googlecalendar.htm
- 问题com.google.gdata.util.ResourceNotFoundException:Google Analytic无法找到
- 从Oauth2 Google Contacts API获取Userinfo
- 使用Google表格API和服务帐户时禁止使用403
- 没有MapActivity的MapView
- 如何在日历Api中禁用Google的“video通话”默认设置?
- 谷歌+域名API快速启动java无法正常工作
- 如何在我的Java应用程序中使用Google Translate API?
- Google Admin SDK目录API(Java)中的members.list()
- 使用Java通过API写入GoogleSheet