我正在开发一个使用OAuth2和Google客户端库(位于Appengine和GWT BTW上)访问Google API(从Calendar
API开始)的应用。
我已经实现了我的OAuth2Call
后台servlet,扩展了Google
AbstractAppEngineAuthorizationCodeCallbackServlet
。
我可以使用它,可以访问并可以查看日历等,但是有两个问题:
1)尽管明确要求离线访问,但我没有获得刷新令牌:
public static GoogleAuthorizathtml" target="_blank">ionCodeFlow 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控制台中查看设置?
您应该注意的一件事:仅当用户明确同意所请求的作用域时,才会返回刷新令牌(除了访问令牌之外)。基本上,显示批准页面时。所有后续流将仅返回访问令牌。
现在,为了测试您的应用程序并确保您第一次收到刷新令牌,您可以使用rovaling_prompt =
force参数(builder.setApprovalPrompt("force")
)来确保流程中显示了批准页面,并获得了用户的明确同意。解决所有问题并确保正确保存刷新令牌后,可以删除该标志(默认为auto
)
开发人员指南的“
离线访问”部分也提供了更多信息。
我已经阅读了JWT和访问令牌和刷新令牌。我知道您必须在很短的时间(分钟)内设置访问令牌过期,并在过期时使用刷新令牌获取新的访问令牌。 我不清楚三件事: 谁检查访问令牌是否过期?客户端是否通过发送过期的访问令牌和刷新来检查并请求新的访问代码? 谁检查刷新令牌是否过期?(显然刷新令牌也需要过期,尽管需要更长的时间才能过期)。 在我看来,如果刷新令牌过期,则必须提示用户重新登录。在某些情况下(移动应用)
我如何从第一次授权代码中获得刷新令牌和访问令牌?并且,我如何重用这个刷新令牌来获得一个新的访问令牌,以便使用Java API上传到Google Drive?这不是一个web应用程序。它在Java Swing代码中。
这是我的身份验证流程: 用户登录后收到两个令牌(具有过期时间的访问令牌和没有过期时间的刷新令牌) 对于每个用户,刷新令牌存储在数据库中名为refreshTokens的json列中(这是一个数组) 在客户端,访问令牌和刷新令牌都存储在本地存储器上 当需要验证用户时,如果访问令牌过期,将使用刷新令牌创建一个新的访问令牌,并将其发送回用户并保持用户登录 当用户注销时,数据库中存储的刷新令牌(在refre
null 很抱歉太啰嗦了。 提前谢了。
我想使用谷歌作为OIDC协议的id提供商。我有一个简单的应用程序。它启动,正确地重定向到谷歌,然后返回到应用程序,打印用户详细信息并将其存储在会话中。但是,这种身份验证似乎来自id令牌,并且只有1h的过期时间 我的YML:
目前访问类型处于联机状态。当我需要访问驱动器上的文件/文件夹时,我将浏览器重定向到Google URL并获得访问代码: 一切运转良好!但我只需要第一次重定向。 当我谷歌时,在google Drive API文档中,我发现我可以通过浏览器重定向获得刷新令牌,并将其保存在数据库中。(换句话说,我可以使用脱机访问)。 而且每次当我需要从google drive读取数据时,我使用刷新令牌获得访问令牌,而无