访问令牌过期后显示用户同意屏幕
User Consent Screen Shows Up After Access Token Expires
我正在尝试将 Google Calendar API 集成到我的一个 Google App Engine 项目中,该项目基于 Spring Boot。使用基于 JAVA 的 google-client-api 库进行授权。我将在我的 App Engine 项目中创建的客户端 ID 和密码提供给 GoogleAuthorizationCodeFlow
。在我的第一个 运行 中,我收到了一个用户同意屏幕,接受后,StoredCredential
文件在 target/tokens 中创建。此后,我的所有 Google 日历 API 调用都正常。一段时间后,我猜这与访问令牌过期有关,我再次看到用户同意屏幕。根据文档,如果访问类型设置为 offline
,授权流程将负责管理刷新令牌。 StoredCredential
文件仍在 target/tokens 路径中,但我仍然看到用户同意屏幕。粘贴授权代码片段。
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
// Load client secrets.
InputStream in = EventController.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline")
.build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}
public static Calendar get() throws GeneralSecurityException, IOException {
// Build a new authorized API client com.huddle.processor.service.
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
return new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
}
更新:
在远程调试时,当 google-oauth-client 使用
从文件中获取存储的凭证时
StoredCredential stored = credentialDataStore.get(userId);
刷新令牌为空。想知道这是否是原因,但不确定为什么没有设置。
如果有人能让我知道我错过了什么,那就太好了。谢谢
找到解决方法。这与无法获取刷新令牌有关。需要传递 approval_prompt=force 参数。所以更新后的代码片段是
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline")
.setApprovalPrompt("force")
.build();
对我有帮助的参考博客:https://googlecode.blogspot.com/2011/10/upcoming-changes-to-oauth-20-endpoint.html
我正在尝试将 Google Calendar API 集成到我的一个 Google App Engine 项目中,该项目基于 Spring Boot。使用基于 JAVA 的 google-client-api 库进行授权。我将在我的 App Engine 项目中创建的客户端 ID 和密码提供给 GoogleAuthorizationCodeFlow
。在我的第一个 运行 中,我收到了一个用户同意屏幕,接受后,StoredCredential
文件在 target/tokens 中创建。此后,我的所有 Google 日历 API 调用都正常。一段时间后,我猜这与访问令牌过期有关,我再次看到用户同意屏幕。根据文档,如果访问类型设置为 offline
,授权流程将负责管理刷新令牌。 StoredCredential
文件仍在 target/tokens 路径中,但我仍然看到用户同意屏幕。粘贴授权代码片段。
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
// Load client secrets.
InputStream in = EventController.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline")
.build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}
public static Calendar get() throws GeneralSecurityException, IOException {
// Build a new authorized API client com.huddle.processor.service.
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
return new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
}
更新: 在远程调试时,当 google-oauth-client 使用
从文件中获取存储的凭证时StoredCredential stored = credentialDataStore.get(userId);
刷新令牌为空。想知道这是否是原因,但不确定为什么没有设置。
如果有人能让我知道我错过了什么,那就太好了。谢谢
找到解决方法。这与无法获取刷新令牌有关。需要传递 approval_prompt=force 参数。所以更新后的代码片段是
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline")
.setApprovalPrompt("force")
.build();
对我有帮助的参考博客:https://googlecode.blogspot.com/2011/10/upcoming-changes-to-oauth-20-endpoint.html