【问题标题】:Google's OpenID Connect says: OAuth 2 parameters can only have a single value: client_id谷歌的 OpenID Connect 说:OAuth 2 参数只能有一个值:client_id
【发布时间】:2015-06-23 20:17:19
【问题描述】:

作为 OpenID Connect(用于登录的 OAuth2)的一部分,我的应用程序应该通过端点 https://www.googleapis.com/oauth2/v3/token 请求访问令牌,给定一次性授权代码。根据documentation,这个请求需要传递5个参数,其中client_id。这正是我的应用程序所做的,使用 Perl 模块 Net::OAuth2

几个月来一切正常,但今天我收到通知说它停止工作了。没有对应用程序代码和它使用的库进行更新。

调用token 端点时,我的应用程序现在从服务器收到的消息是这样的,在400 错误响应中:

OAuth 2 parameters can only have a single value: client_id

Google 搜索表明,以前没有人见过这条消息,也没有人活着讲述这个故事。 Google 的 OpenID Connect 似乎没有普遍问题(基于它的其他服务运行良好),而且旧登录协议即将关闭似乎并不相关。

更多测试:删除除client_id 之外的所有参数会导致此错误消息:

Required parameter is missing: grant_type

仅提供 client_idgrant_type 会再次产生原始错误消息。

有人知道这里发生了什么吗?

【问题讨论】:

  • 我没有遇到这样的问题;也许这个问题是由NET::OAuth2 重复参数(即发送 client_id 两次)和谷歌加强他们的实施引起的?您可以通过使用 cURL 调用手动交换 code 和/或查看 NET::OAuth2 在线发送的 HTTP 发布参数来检查。
  • @HansZ。好主意,谢谢,刚刚添加了代码来转储生成的请求。但是,查询字符串和 POST 正文中没有重复。我现在正在尝试从 Google API 团队获得帮助,但如果您有任何进一步的想法,我们将不胜感激。
  • 如何抓住code,因为它并没有被消耗,并在cURL调用中使用它;这个对我有用:curl -v -d "grant_type=authorization_code&redirect_uri=<redirect_uri>&client_id=<client_id>&client_secret=<client_secret>&code=<code>" https://www.googleapis.com/oauth2/v3/token

标签: oauth-2.0 google-oauth


【解决方案1】:

Google changed this behavior few days ago,因此任何使用基本身份验证标头 AND 正文请求参数的 OAuth2 库都将开始看到类似

的消息
OAuth 2 parameters can only have a single value: client_id

OAuth 2 parameters can only have a single value: client_secret

因此,您现在必须同时使用(Auth 标头和正文请求参数)向 Google 发送凭据。

根据RFC 6749,发送凭据的最佳方式是通过 Auth 标头(感谢@JanKrüger 提醒我这一点)。

【讨论】:

  • 不使用 Auth 标头实际上可能不是最好的方法。根据 RFC 6749 第 2.3.1 节,服务器中需要支持 Authorization 标头,并且既不需要也不建议使用请求正文中的字段。在这一点上,Google 所关心的是您只使用这些选项中的 一个,如果您想更紧密地遵守 RFC,请使用 only Authorization 标头似乎是更安全的选择。
  • 你是对的@JanKrüger(我赞成你的评论):我将更新我的答案以明确使用其中一个,最好只使用 Auth 标头。
【解决方案2】:

遇到同样的错误。似乎问题在于NET::OAuth2 在交换访问令牌的授权码时设置了authorization 标头。如果您删除此标头,一切正常。 检查Net::OAuth2::Profile::WebServer 模块中的get_access_token 方法。 authorization 标头包括 client_id:client_secret base64 编码字符串。显然,Google 现在将这种重复视为错误。

解决这个问题的正确方法是在创建Net::OAuth2::Profile::WebServer 对象时设置secrets_in_params 参数。查看Net::OAuth2::Profile 文档了解更多详情。

【讨论】:

  • 当服务器支持该选项时,最好只在标头中传递凭据。
猜你喜欢
  • 2018-03-10
  • 2013-04-10
  • 2023-03-18
  • 2012-07-31
  • 2013-10-18
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多