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

Google's OpenID Connect says: OAuth 2 parameters can only have a single value: client_id

作为 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 在交换访问令牌的授权代码时设置了 authorization header。如果你删除这个 header 一切正常。 检查 Net::OAuth2::Profile::WebServer 模块中的 get_access_token 方法。 authorization header 包括 client_id:client_secret base64 编码的字符串。显然 Google 现在将此重复视为错误。

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

Google changed this behavior few days ago,因此任何使用 Basic Auth headers AND body 请求参数的 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 headers 和 body 请求参数)将凭据发送到 Google.

并且根据 RFC 6749,发送凭据的首选方式是通过 Auth headers(感谢 @JanKrüger 提醒我这件事)。