Java 如何获得离线令牌和刷新令牌以及对Google API的自动刷新访问
我正在开发一个应用程序,使用OAuth2和谷歌客户端库(在Appengine和GWT BTW上)访问谷歌API(从日历API开始) 我已经实现了我的Java 如何获得离线令牌和刷新令牌以及对Google API的自动刷新访问,java,google-app-engine,oauth-2.0,google-api,Java,Google App Engine,Oauth 2.0,Google Api,我正在开发一个应用程序,使用OAuth2和谷歌客户端库(在Appengine和GWT BTW上)访问谷歌API(从日历API开始) 我已经实现了我的OAuth2CallBackServlet,扩展了GoogleAbstractAppingineAuthorizationCodeCallBackServlet 我让它工作,我可以访问,可以查看日历等,但有两个问题: 1) 尽管明确请求脱机访问,但我没有获得刷新令牌: public static GoogleAuthorizationCodeFlow
OAuth2Call
BackServlet,扩展了GoogleAbstractAppingineAuthorizationCodeCallBackServlet
我让它工作,我可以访问,可以查看日历等,但有两个问题:
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) 我看不出如何设置自动刷新功能。
这些页面描述了以下方法:
Credential.Builder
类不同,在GoogleAuthorizationCodeFlow.Builder
类中没有这样的方法
编辑
在进一步调试代码之后,当凭证返回时(在onSuccess()
方法中),它似乎已经设置了RefreshListener
。。因此,这可能是默认情况下它们的设置,我唯一的问题是,尽管请求,但我没有获得refresh\u令牌
可能还需要查看Google API控制台中的设置?有一件事需要注意:只有当用户明确同意请求的作用域时,才会返回刷新令牌(除了访问令牌之外)。基本上,当显示审批页面时。所有后续流将只返回一个访问令牌
现在,为了测试应用程序并确保第一次收到刷新令牌,您可以使用approval_prompt=force参数(builder.setApprovalPrompt(“force”)
)来确保审批页面显示在流程中,并获得用户的明确同意。在解决所有问题并确保刷新令牌正确存储后,可以删除该标志(默认为auto
)
更多信息也可以在开发者指南中找到。我对此进行了研究,并得出结论,访问令牌只需要使用一次。也就是说,每个Google查询都有两个步骤:
使用刷新令牌生成临时访问令牌
将access_令牌用于操作所需的一个或多个查询
我在这里看到了一些关于确保服务器时钟同步的帖子。但这似乎是不必要的复杂性
有关更详细的说明:要获取刷新令牌,您必须同时设置accessType
=“脱机”和approvalPrompt
=“强制”
谢谢你的评论,我将按照这些思路进行检查。目前,我对令牌进行了显式撤销,然后再次请求,我总是为用户通过显式接受屏幕-但仍然没有得到刷新令牌。vlatko,除了提示强制,我正在做你说的一切,这似乎已经解决了它!所以,非常感谢您的回答!这是一个bug,还是仅仅是文档(太广泛了…)中的一个明显遗漏?谢谢Sunny。但问题是,在第一次授权时,我得到的是AccessToken,而不是RefreshToken,尽管通过将AccessType设置为“offline”来请求它。如果你使用Google类(一旦你有一个RefreshToken),他们会存储它,并使用它在新的AccessToken过期时自动获取一个新的AccessToken,这对你来说是透明的。好的,谢谢你!.setApprovalPrompt(..)必须是一个相对较新的要求。大约一两个月前,我的代码在没有这个选项的情况下运行,它给了我刷新令牌。突然,它停止了工作,我不禁想知道为什么。
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT,
JSON_FACTORY,
CLIENT_ID,
CLIENT_SECRET,
SCOPE)
.setAccessType("offline")
.setApprovalPrompt("force")
.build();