oauth - 尝试使用 Cognito 向 Battle.net OIDC 进行身份验证时出现错误的 id_token 颁发者
问题描述
过去几天我一直在尝试设置 Cognito 以使用 Battle.net OIDC。我相信我大部分时间都在那里。我可以看到使用 cognito 托管的 UI,它可以正确验证但随后失败,可能是试图检索令牌。
对 cognito 托管 UI 的第一个请求:
https://<removed>.auth.us-west-2.amazoncognito.com/oauth2/authorize?identity_provider=Blizzard&redirect_uri=https://<my-site-oauth-handler-removed>/oauth&response_type=CODE&client_id=<removed>&scope=openid
然后下一个请求是按预期向战网 OIDC 发出的:
https://us.battle.net/oauth/authorize?client_id=<removed>&redirect_uri=https%3A%2F%2F<removed>.auth.us-west-2.amazoncognito.com%2Foauth2%2Fidpresponse&scope=openid&response_type=code&state=<removed>
然后将代码传递到 cognito idpresponse:
https://<removed>.auth.us-west-2.amazoncognito.com/oauth2/idpresponse?code=<removed>&state=<removed>
此时,如果我的理解是正确的,cognito 应该尝试点击战网/oath/token
端点,然后将 id_token 和 access_token 返回到我的 redirect_url。它在这一点上 cognito 反而向我的网址返回了一个错误:
https://<my-site-oauth-handler-removed>/oauth?error_description=Bad+id_token+issuer+oauth.battle.net&error=invalid_request
从缺乏战网 OIDC 的文档来看,我可能是少数尝试将战网 OIDC 与 Cognito 一起使用的人之一。他们的实现很可能是一个错误,但我尽量不得出这个结论。
我现在最好的猜测是我没有正确配置 Cognito 来发出令牌 POST 请求。它需要使用带有 clientid:password 的基本身份验证,但我无法验证它是否正确执行此操作,因为它已被抽象掉。
无论如何,当我通过我的应用程序(使用放大打开托管 UI)发出请求时,它确实返回但具有以下内容:
[ERROR] 51:05.25 OAuth - Error handling auth response. Error: Bad+id_token+issuer+oauth.battle.net
at OAuth.<anonymous> (OAuth.js:202)
at step (OAuth.js:52)
at Object.next (OAuth.js:33)
at OAuth.js:27
at tryCallTwo (core.js:45)
at doResolve (core.js:200)
at new Promise (core.js:66)
at __awaiter (OAuth.js:23)
at OAuth.handleAuthResponse (OAuth.js:181)
at AuthClass.<anonymous> (Auth.js:1632)
这是我所有相关的 Cognito 配置:
OIDC 提供商:
- 提供者名称:暴雪
- 客户 ID:[已删除]
- 客户端密码:[已删除]
- 属性请求方式:POST
- 授权范围:openid
- 发行人:https ://us.battle.net/oauth
应用客户端:
- 名称:[已删除]
- 应用程序客户端 ID:[已删除]
- 应用客户端密钥:(无密钥)
应用客户端设置:
- 启用身份提供者:暴雪
- 回调 URL:https://[removed]/oauth
允许的 OAuth 流:
- 授权码授予
- 隐式授权
- 允许的 OAuth 范围
- 电子邮件
- 打开ID
- aws.cognito.signin.user.admin
- 轮廓
- (我已经尝试了这些的每一种变化,它似乎并没有改变结果)
联合身份:
- 身份验证提供程序
- 开放ID
- us.battle.net/oauth
- 开放ID
IAM 身份提供商:
- 提供者名称:us.battle.net/oauth
- 提供者类型:OIDC
- 提供者网址:us.battle.net/oauth
- CA 指纹:[已删除]
- 观众:[我的战网客户端ID]
我已经用尽了自己的资源,并要求对此提供任何指导。
谢谢!
解决方案
这是由于暴雪从其众所周知的端点发布其令牌但设置了导致 Cognito(或任何其他令牌验证)失败的iss
字段,因此出现错误消息oauth.battle.net
Bad+id_token+issuer+oauth.battle.net
我向他们在 Discord 的 API 团队提出了这个问题,根据发送给开发人员的电子邮件,他们将在 11 月 25 日发布修复程序。
尊敬的社区开发者,
今年早些时候,我们引入了一个新的 OAuth 发现端点,它实现了 OpenID Connect 发现规范。我们希望在从 oauth.battle.net 到由众所周知的配置端点 JSON 响应返回的颁发者的 OpenID 授权流期间部署对 id_token 的颁发者字段 iss 的更改。这可能是对一些 OAuth OIDC 客户端的潜在重大更改,但它符合 OpenID 连接规范: https ://openid.net/specs/openid-connect-core-1_0.html#IssuerIdentifier
您的 OAuth 客户端应用程序被确定为可能受此更改影响的应用程序。
我们计划在 2019 年 11 月 25 日发布此更改。
以下是您可以采取的步骤,以确保您的 OpenID Connect 客户端在更改后继续工作:
导航到下面与您的客户端应用程序运行的区域相对应的众所周知的配置端点之一,并检查“颁发者”字段。
如果颁发者字段与为您的 OAuth OIDC 客户端配置的颁发者匹配,那么您的客户端是兼容的,并且您已经合规并且不需要进行任何更改。
如果来自知名配置端点的颁发者字段与您的客户端配置中设置的颁发者不同,请更改颁发者以匹配知名配置端点。
如果您的客户端支持 OpenID 发现端点标准,您可以将其配置为从众所周知的配置端点读取所有必要的设置。您的 OAuth 客户端应自行配置。
推荐阅读
- c++ - How to safely copy structs with members pointing to other nested members in C++
- openxml - OpenXML source code : how to compile it to target .net 4.0 or 4.6?
- pagination - React-Bootstrap Pagination component adds a random (current) to the current page
- python - How to scrape star ratings using Selenium or Beautifulsoup in Python?
- numpy - 使用 Numpy 获取多项式的系数
- 3d - Making 3D object with 3D Builder - Blank .mtl material file?
- bash - 重定向 dbaccess 输出会丢失一个字符
- javascript - 从对象中删除不需要的项目
- python - Synapse notebook storage csv as a folder format
- azure-data-explorer - Kusto 查询 (KQL) 迭代子查询中的标量值