AWS Cognito 中的“访问令牌不包含 openid 范围”
Posted
技术标签:
【中文标题】AWS Cognito 中的“访问令牌不包含 openid 范围”【英文标题】:"Access token does not contain openid scope" in AWS Cognito 【发布时间】:2019-02-24 19:09:26 【问题描述】:我正在一个前端应用程序上运行一个有效的 AWS Cognito 服务,它可以成功地完成基本的工作 - 登录、注销、注册等。
现在我正在尝试通过后端 API 获取用户属性,例如:
1) 用户登录应用程序并获得 JWT。
2) JWT 正在发送到后端服务器。
3) 服务器必须使用访问令牌提取用户的电子邮件
我发现最接近我需要的是this Cognito 服务。
所以我正在向“https://mydomain.auth.eu-central-1.amazoncognito.com/oauth2/userInfo”发出 GET 请求 使用他们要求的授权标头,但我不断收到此响应:
“错误”:“无效令牌”, "error_description": "访问令牌不包含 openid 范围"
我已尝试搜索此错误,但找不到有关该错误的任何解释。
提前致谢
【问题讨论】:
【参考方案1】:如果我理解正确,您将成功地将 #id_token
从 Cognito 发送到您的前端(步骤 1-3)。您可以通过在 Cognito Pool 应用程序客户端设置中选择以下选项来启用 #id_token
上的范围:
【讨论】:
我已经勾选了所有这些但有这个问题..【参考方案2】:Erez,您使用的是自定义 UI 吗? 因为自定义 UI 使用与 OAuth2 完全分离的流程(USER_SRP_AUTH、USER_PASSWORD_AUTH)。随这些流发布的令牌不符合 OpenID Connect(基本上它们不包含 openid 范围),因此您不能使用它们来收集用户信息(因为 userinfo 端点符合 OpenID Connect 并且需要使用符合以下条件的 jwts 来调用) OIDC 标准)。 我们也在为此苦苦挣扎,对不起。
【讨论】:
我们写信给 AWS 支持,他们给了我们一个脚本,该脚本基本上通过脚本执行 OAuth2 授权代码流。所以在我之前写的时候(4 月 18 日),这是一个已知问题,获得 OpenID 令牌的唯一解决方法是以“隐藏”样式执行授权代码流。对于我们的用例和需求,我们决定切换到另一个 IAM。 对不起,我不能。这是通过脚本遵循授权代码流,解析各种响应返回的 html 的问题。对不起【参考方案3】:我遇到了这个确切的问题,这是我的错。我发送的是 id_token
而不是令牌的 access_token
属性。
我用 php 编程,所以我作为标题发送 "Authorization: Bearer ".$token->id_token
而不是 "Authorization: Bearer ".$token->access_token
。现在可以了。
希望它对您或某人有所帮助。
【讨论】:
我今天通过 REST 调用玩它时拥有所有 3 个令牌并且遇到了同样的问题。读到这里,让我仔细检查了一下,我也犯了同样的错误:)【参考方案4】:我遇到了类似的问题,我花了几个小时才找到解决方案。您从前端应用程序中的 cognito 收到的访问令牌,您需要将其发送到后端,然后对其进行解码并验证它。这是来自 aws 的一个很好的文档:https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html
【讨论】:
【参考方案5】:我仍然遇到同样的问题。我的问题依赖于在 Amplify 框架中以编程方式使用登录服务(不是通过联合登录托管 UI)。经过长时间的谷歌搜索,我发现这是因为“openid”不包括在令牌的范围内。仅包含“aws.cognito.signin.user.admin”。
你可以在这里找到参考,线程仍然开放https://github.com/aws-amplify/amplify-js/issues/3732
这个解决方案对我来说似乎很好How to verify JWT from AWS Cognito in the API backend?
【讨论】:
以上是关于AWS Cognito 中的“访问令牌不包含 openid 范围”的主要内容,如果未能解决你的问题,请参考以下文章
通过 Cognito 生成的授权令牌识别 AWS Lambda 中的用户
AWS Cognito - 使用 JWT 与 cognito.getUser 开发工具包验证令牌
如何使用 AWS Cognito 中的现有用户池生成 aws-exports.js?
更改 AWS Cognito 访问令牌 JWT 中的加密算法