我正在开发一个应用程序,使用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)我看不到如何设置自动刷新功能。 这些页面描述了方法:
但我看不到添加刷新侦听器的位置。与GoogleAuthorizationCodeFlow.Builder
类
Credential.Builder
类中没有此类方法
EDIT
在更多地调试代码之后,当凭证返回时(在onSuccess()
方法中)它似乎已经设置了RefreshListener
.....所以也许这是他们默认的,我唯一的问题是尽管要求它,我还没有得到refresh_token
。
也许还需要在Google API控制台中查看设置?
答案 0 :(得分:20)
您应该注意的一件事:只有当用户明确同意所请求的范围时,才会返回刷新令牌(除了访问令牌)。基本上,当显示批准页面时。所有后续流程仅返回访问令牌。
现在,为了测试您的应用程序并确保您第一次收到刷新令牌,您可以使用approval_prompt = force参数(builder.setApprovalPrompt("force")
)来确保流程中显示批准页面并获得用户的明确同意。在排除任何问题并确保正确存储刷新令牌后,您可以删除该标志(默认为auto
)
开发者指南中的offline access section也提供了更多信息。
答案 1 :(得分:5)
要获取刷新令牌,您必须同时设置accessType =“offline”和approvalPrompt =“force”。
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT,
JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, SCOPE).setAccessType("offline").setApprovalPrompt("force").build();
答案 2 :(得分:0)
我调查了这一点,并得出结论,access_token只需要使用一次。也就是说,每个Google查询都是一个两步过程:
我在这里看了几篇关于确保服务器时钟同步的帖子。但这似乎是不必要的复杂性。