【问题标题】:Using Google Calendar API fro Java and Oauth 2.0: "Insufficient Permission" error从 Java 和 Oauth 2.0 使用 Google Calendar API:“权限不足”错误
【发布时间】: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


【解决方案1】:

如果我理解您所描述的问题正确,增量授权可能就是您正在寻找的:https://developers.google.com/accounts/docs/OAuth2WebServer#incrementalAuth

具体来说,将 include_granted_scopes=true 添加到您的授权 URL,这应该会导致生成的令牌包含所有迄今为止授予的授权的总和。

【讨论】:

  • 基本上我已经解决了这个问题。从存储的令牌创建 GoogleCredential 对象时,我没有设置刷新和访问令牌,而是设置了存储的刷新令牌和分配新访问令牌的调用 c.refreshToken()。通过这种方式,它运作良好。无论如何,您的观点非常有用,因为我已经解决了您所说的问题,并且我通过在日历服务请求中还包括所有先前询问的范围来解决了它,它不是很漂亮。所以我想我会按照你的建议切换到增量授权。谢谢你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2020-07-03
  • 2021-07-11
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多