即使似乎授予访问权限,Google Calendar API在OAuth期间也会出现403错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即使似乎授予访问权限,Google Calendar API在OAuth期间也会出现403错误相关的知识,希望对你有一定的参考价值。

我的应用会在用户的Google日历上发布,修改和删除活动。我正在配置OAuth以实现这一目标。这个想法是,在注册后,用户将能够进入他们的设置并同意将我的应用程序连接到他们的Google日历。然后,我将能够在数据库中存储oauth令牌和刷新令牌,并在用户日历上创建/编辑/删除事件时使用它们。

无论如何,问题是我选择了我的帐户:

Choosing account

然后我点击“允许”提供同意:

Allowing access

以下是它变得奇怪的地方:在幕后,Google Calendar API会报告403 Forbidden错误。

%Ueberauth.Failure{errors: [%Ueberauth.Failure.Error{message: 403,
message_key: "OAuth2"}], provider: :google,
strategy: Ueberauth.Strategy.Google}

我的ueberauth配置:

config :ueberauth, Ueberauth,
  providers: [
    google: {Ueberauth.Strategy.Google, [default_scope: "https://www.googleapis.com/auth/calendar", approval_prompt: "force", access_type: "offline"]}
]

我正在提出的要求:

def callback(%{assigns: %{ueberauth_failure: fail}} = conn, _params) do
  IO.inspect fail
  conn
  |> put_flash(:error, "Failed to authenticate.")
  |> redirect(to: "/")
end

def callback(%{assigns: %{ueberauth_auth: auth}} = conn, _params) do
  IO.inspect auth
  conn
  |> put_flash(:success, "Connected to Google.")
  |> redirect(to: "/")
end

第一个callback函数是匹配的函数(因为它失败了)。

但是,当我转到我的Google帐户时,我可以看到该应用已被授予权限:

Access granted

我提供了正确的client_id和client_secret。此外,我在Google API控制台中创建了一个服务帐户,并与该帐户共享了我的日历:

Calendar sharing settings

我还需要做什么?

编辑:更多信息 - 我可以通过我的代码(它是样板Ueberauth_Google)授予对所有其他Google模块的访问权限。例如,如果我使用电子邮件作为范围发出请求,它就可以工作,我从Google获得auth_token。只有谷歌日历提供403,这使我相信有一些特定的东西导致它。

编辑2:我查看了error handling section of the Google Calendar API,其中列出的403错误都不适用于我:

  • 403:超出每日限制
  • 403:超出用户速率限制
  • 403:超出速率限制
  • 403:超出日历使用限制

编辑3:我创建了一个全新的Google帐户,并与我的Google服务帐户共享其日历。但是那个给出了同样的错误。

答案

终于想通了。

https://www.googleapis.com/auth/calendar范围本身是不够的。还需要将https://www.googleapis.com/auth/userinfo.profile添加到范围。

以上是关于即使似乎授予访问权限,Google Calendar API在OAuth期间也会出现403错误的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:即使授予了授权,也拒绝架构的权限

无需身份验证令牌即可访问 Google 电子表格 API

存储访问框架 - 权限被拒绝问题,即使授予权限

oauth2.0授予Web应用访问用户的Google spreadhseets所需的最小范围是多少?

即使 IAM 策略授予访问权限,Web 应用程序也无法访问私有 s3 文件

即使授予正确的权限,Spring Security @Secured 也会拒绝访问