【发布时间】:2015-04-24 01:49:24
【问题描述】:
我有一个用户可以使用谷歌登录的应用程序。用户在体验到应用程序的过程中还可以选择集成 GoogleCalendar 服务。为了实现这一点,我的实际系统如下所示:
-当用户使用 google 登录时,系统会存储他的访问和刷新令牌,并调用 Google 检索基本配置文件信息。为此,我使用以下调用创建了一个 GoogleCalendar 对象:
GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(GOOGLE_CALLBACK_URI).execute();
GoogleCredential credential= new GoogleCredential.Builder().setJsonFactory(Constants.JSON_FACTORY)
.setTransport(Constants.HTTP_TRANSPORT).setClientSecrets(Constants.GOOGLE_CLIENT_ID, Constants.GOOGLE_CLIENT_SECRET).build();
credential.setAccessToken(response.getAccessToken());
credential.setRefreshToken(response.getRefreshToken());
-当用户选择集成日历服务时,另一个 Oauth 迭代开始并使用新代码。我像以前一样询问 GoogleCredential 并访问该服务。
-当系统需要执行一些访问 Google 日历的操作时,我会使用以下调用创建一个 GoogleCredential 对象:
GoogleCredential c= new GoogleCredential.Builder().setJsonFactory(Constants.JSON_FACTORY)
.setTransport(Constants.HTTP_TRANSPORT).setClientSecrets(Constants.GOOGLE_CLIENT_ID, Constants.GOOGLE_CLIENT_SECRET).build()
.setAccessToken(user.getAccessToken()).setRefreshToken(user.getRefreshToken());
Ans 然后要求提供服务。但在最后一种情况下,我收到错误报告 403 代码和“权限不足”消息。
我已检查我设置到 GoogleCredential 中的存储访问和刷新令牌与我第一次使用“代码”获取 GoogleCredential 时收到的相同。我也在网上搜索了很多,但没有解决办法。我真的被这个错误阻止了。提前感谢您的帮助,如果我错过了具体说明或在提问时犯了一些错误,我们深表歉意。
【问题讨论】:
-
哪些范围用于访问日历 API?如果您在用户日历中书写,您应该具有“googleapis.com/auth/calendar”范围,并且日历也应该与您共享。即使是阅读用户日历,也应该与您共享或公开。另外,请检查开发者控制台中是否启用了日历 API?
-
我认为范围是正确的,我在我的请求中设置了以下范围: private static final java.util.List
GOOGLE_SCOPE = Arrays.asList("googleapis.com/auth/userinfo.profile","https://…);
标签: java oauth-2.0 google-calendar-api