谷歌的OpenID Connect说:OAuth 2参数只能有一个值:client_id

时间:2015-04-17 09:04:56

标签: oauth-2.0 google-oauth

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

几个月来一切都运转良好,但今天我被告知它已停止工作。没有对应用程序代码或它使用的库进行更新。

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

OAuth 2 parameters can only have a single value: client_id

谷歌搜索表明,之前没有人见过这个消息,或者过着告诉过这个故事。谷歌的OpenID Connect似乎不是一般问题(基于它的其他服务正在完美运行),旧登录协议的即将关闭似乎并不相关。

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

Required parameter is missing: grant_type

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

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

2 个答案:

答案 0 :(得分:3)

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

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

根据RFC 6749,发送凭据的首选方式是通过Auth标头(感谢@JanKrüger提醒我此事。)

答案 1 :(得分:2)

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

解决此问题的正确方法是在创建secrets_in_params对象时设置Net::OAuth2::Profile::WebServer参数。查看Net::OAuth2::Profile文档以获取更多详细信息。