Oauth 2.0 谷歌';s OpenID Connect说:OAuth 2参数只能有一个值:client\u id

Oauth 2.0 谷歌';s OpenID Connect说:OAuth 2参数只能有一个值:client\u id,oauth-2.0,google-oauth,Oauth 2.0,Google Oauth,作为OpenID Connect(OAuth2用于登录)的一部分,我的应用程序应该通过端点https://www.googleapis.com/oauth2/v3/token。根据,此请求需要向其传递5个参数,client\u id。这正是我的应用程序所做的,使用Perl模块Net::OAuth2 几个月来,一切正常,但今天我接到通知,它停止工作了。未对应用程序代码及其使用的库进行更新 在400错误响应中,我的应用程序现在在调用token端点时从服务器收到的消息如下: OAuth 2 param

作为OpenID Connect(OAuth2用于登录)的一部分,我的应用程序应该通过端点
https://www.googleapis.com/oauth2/v3/token
。根据,此请求需要向其传递5个参数,
client\u id
。这正是我的应用程序所做的,使用Perl模块
Net::OAuth2

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

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

OAuth 2 parameters can only have a single value: client_id
谷歌搜索显示,以前没有人看到过这条消息,也没有人活着讲述过这个故事。谷歌的OpenID Connect似乎没有什么大问题(基于它的其他服务正在完美地工作),而即将关闭的旧登录协议似乎也不相关

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

Required parameter is missing: grant_type
仅提供
client\u id
grant\u type
会再次生成原始错误消息


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

也有同样的错误。问题似乎是,
NET::OAuth2
在为访问令牌交换授权代码时设置了
authorization
头。如果删除此标题,一切正常。 检查
Net::OAuth2::Profile::WebServer
模块中的
get\u access\u token
方法。
authorization
标题包括
client\u id:client\u secret
base64编码字符串。显然,谷歌现在将这种重复视为一种错误

解决此问题的正确方法是在创建
Net::OAuth2::Profile::WebServer
对象时,在参数中设置
secrets\u。查看文档了解更多详细信息。

Google,因此任何使用基本Auth头body请求参数的OAuth2库都将开始看到如下消息

OAuth 2 parameters can only have a single value: client_id

因此,您现在必须而不是同时使用这两个参数(Auth头和body请求参数)向Google发送凭据


据介绍,发送凭证最好的方式是通过Auth头(感谢@JanKrüger提醒我这一点)。

我没有遇到这样的问题;这个问题可能是由复制参数(即发送两次客户端id)和谷歌收紧其实现而引起的?您可以通过使用cURL调用手动交换
code
进行检查,和/或查看
NET::OAuth2
在线路上发送的HTTP post参数。@HansZ。好主意,谢谢,只是添加了代码来转储生成的请求。但是,查询字符串和POST正文中没有重复。我现在正试图从Google API团队获得帮助,但如果有任何进一步的想法,我将不胜感激;这一个对我有用:
curl-v-d“grant\u type=authorization\u code&redirect\u uri=&client\u id=&client\u secret=&code=
”https://www.googleapis.com/oauth2/v3/token
不使用Auth头实际上可能不是最好的方法。根据RFC 6749第2.3.1节,服务器中需要对授权标头的支持,并且不需要也不建议在请求正文中使用字段。谷歌现在关心的是,你只使用其中一个选项,如果你想更贴近RFC,只使用
授权
标题似乎更安全。你是对的@JanKrüger(我对你的评论投了更高的票):我会更新我的答案,明确只使用其中一个,最好只传递身份验证头。如果服务器支持该选项,最好只传递头中的凭据。
OAuth 2 parameters can only have a single value: client_secret