尝试使用 Cognito 向 Battle.net OIDC 进行身份验证时出现错误的 id_token 颁发者

Posted

技术标签:

【中文标题】尝试使用 Cognito 向 Battle.net OIDC 进行身份验证时出现错误的 id_token 颁发者【英文标题】:Bad id_token issuer when trying to authenticate with Battle.net OIDC with Cognito 【发布时间】:2020-01-27 07:05:11 【问题描述】:

过去几天我一直在尝试设置 Cognito 以使用战网 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 请求。 It needs to use Basic Authentication 带有 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:[已删除] 应用客户端密钥:(无密钥)

应用客户端设置:

启用的身份提供者:暴雪 回调网址:https://[removed]/oauth

退出网址:https://[removed]/oauth

允许的 OAuth 流:

授权码授予 隐式授权 允许的 OAuth 范围 电子邮件 openid aws.cognito.signin.user.admin 个人资料 (我已经尝试了这些变体,但似乎并没有改变结果)

联合身份:

身份验证提供程序 开放ID us.battle.net/oauth

IAM 身份提供者:

提供者名称:us.battle.net/oauth 提供者类型:OIDC 提供者网址:us.battle.net/oauth CA 指纹:[已删除] 观众:[我的战网客户端ID]

我已经用尽了我自己的资源,并在这方面寻求任何指导。

谢谢!

【问题讨论】:

【参考方案1】:

这是由于暴雪从其知名端点发布其令牌但将 iss 字段设置为 oauth.battle.net 导致 Cognito(或任何其他令牌验证)失败因此出现错误消息

Bad+id_token+issuer+oauth.battle.net

我向他们在 Discord 的 API 团队提出了这个问题,根据发送给开发人员的电子邮件,他们将在 11 月 25 日发布修复程序。

尊敬的社区开发者,

今年早些时候,我们引入了一个新的 OAuth 发现端点,该端点 实现 OpenID Connect 发现规范。我们想 在 从 oauth.battle.net 到发行者的 OpenID 授权流程 由众所周知的配置端点 JSON 响应返回。这 对一些 OAuth OIDC 客户端来说可能是一个潜在的重大变化 但它符合 OpenID 连接规范: https://openid.net/specs/openid-connect-core-1_0.html#IssuerIdentifier

您的 OAuth 客户端应用程序被识别为可能是 受此更改的影响。

我们计划在 2019 年 11 月 25 日发布此更改。

您可以采取以下步骤来确保您的 OpenID Connect 更改后客户端将继续工作:

导航到下面的知名配置端点之一 对应于您的客户端应用程序运行的区域,并且 检查“发行人”字段。

如果颁发者字段与为您的 OAuth OIDC 配置的颁发者匹配 客户端,那么您的客户端是兼容的并且您已经是兼容的 并且不需要进行任何更改。

如果来自知名配置端点的 issuer 字段是 请与您的客户端配置中设置的发行人不同 更改颁发者以匹配众所周知的配置端点。

如果您的客户端支持 OpenID 发现端点标准,您 可以将其配置为从众所周知的 配置端点。您的 OAuth 客户端应自行配置。

【讨论】:

以上是关于尝试使用 Cognito 向 Battle.net OIDC 进行身份验证时出现错误的 id_token 颁发者的主要内容,如果未能解决你的问题,请参考以下文章

AWS Cognito - 创建用户而不向他们发送验证电子邮件

Cognito缺乏IDP发起的SSO

AWS CloudFormation 脚本失败 - 不允许 Cognito 使用您的电子邮件身份

用于获取AWS Cognito用户池令牌的OAUTH2服务器?

来自客户端 javascript 的错误 400 Cognito /oauth2/token 端点

通过 Amazon Cognito 提供个人访问权限