作为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_id
和grant_type
会再次生成原始错误消息。
有没有人知道这里发生了什么?
答案 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文档以获取更多详细信息。