【问题标题】:AWS API Gateway Authorizer works with Cognito HostedUI but not with access_token from amazon-cognito-identity-jsAWS API Gateway Authorizer 适用于 Cognito HostedUI,但不适用于 amazon-cognito-identity-js 的 access_token
【发布时间】:2022-10-01 15:33:24
【问题描述】:

当我使用 Cognito HostedUI 时,我从回调页面中的 URL 参数接收 access_token 并将其提供给我的 API 调用标头,如下所示:

new HttpHeaders({
    \'Content-Type\': \'application/json\',
    Authorization: access_token // received from callback URL parameters
});

它工作正常。但是由于 HostedUI 设计的限制,我使用这个tutorial 实现了一个自定义的登录/注销逻辑

由于 amazon-cognito-identity-js 需要一个没有客户端密码的应用程序客户端,我创建了一个新的应用程序客户端。所以现在我有两个。 (不确定是否会导致任何问题)

简化的部分代码如下所示:

let authenticationDetails = new AuthenticationDetails({
    Username: this.email_address, // user input
    Password: this.password // user input
});
let poolData = {
    UserPoolId: environment.cognitoUserPoolId,
    ClientId: environment.cognitoAppClientId
};
let userPool = new CognitoUserPool(poolData);
let userData = { Username: this.email_address, Pool: userPool };
var cognitoUser = new CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: (result: any) => {
    console.log(result);
    const access_token = result.getAccessToken().getJwtToken(); // getting access_token
    if (!access_token) {
    alert(\'User token is not found. Please sign in again.\');
    return;
    }
...

现在这让我登录和注销成功,我得到了用户的详细信息。但是,当我将此 access_token 提供给 API Authorization 标头时,我总是会收到错误 401 Unauthorized 错误。我什至尝试使用 id_token 和 refresh_token,没有任何效果。

我所有的 Cognito、API Gateway、S3、Lambda 等设置都和以前一样。那么为什么我不断收到 401 错误?也许我缺少 IAM 权限?任何帮助,将不胜感激。

更新:

我注意到 HostedUI 回调中的 access_token 有:

\"scope\": \"aws.cognito.signin.user.admin phone openid profile email\"

即使在 Cognito AppClient 设置中我选择了所有 5 个 OpenID Connect 范围,amazon-cognito-identity-js 响应中的 access_token 也只有:

scope: \"aws.cognito.signin.user.admin\"

在每个 API 请求 OAuth 范围选项中,我都有“电子邮件”。所以这似乎是问题所在。我应该在这里添加“aws.cognito.signin.user.admin”吗?或者有没有办法使用 amazon-cognito-identity-js 返回“电子邮件”范围?

  • const access_token = result.getAccessToken();试试这个
  • @Pavindu 感谢您的回答,但它不起作用。当我使用 result.getAccessToken() 时,它返回一个包含 jwtToken 字符串和有效负载对象的对象。
  • result.getIdToken().getJwtToken() 那你可以试试这个吗?
  • @Pavindu 它也不起作用。正如我在问题的更新部分中提到的,问题与 OAuth 范围有关。当我将“aws.cognito.signin.user.admin”范围添加到 API 方法请求选项时,它可以工作。不确定这是否是最佳做法。似乎不安全。
  • 首先,授权方接受 Id Token。无论您进行什么更改,都只能使用 Id 令牌进行测试。测试的下一步应该是生成 id 令牌并在 api 网关控制台中的授权方上手动测试它。检查是否通过。

标签: amazon-web-services aws-api-gateway amazon-cognito access-token amazon-cognito-identity-js


【解决方案1】:

在控制台中更改范围,这里:

【讨论】:

  • 是的,正如我在 4 月 1 日 10:13 的评论中提到的那样,这就是我所做的。我不确定允许每个用户使用“管理员”范围是否是最佳做法。
  • (@tahaerden:您可以使用“根据其日期”链接特定评论。)
  • 谢谢@greybeard。在this comment 中,我解释说我已经使用了“aws.cognito.signin.user.admin”。但我认为它不安全,而且将它添加到每个 API 方法中很麻烦。
【解决方案2】:
  1. 不要使用“admin”范围,使用“email”或“profile”甚至自定义范围。 “电子邮件”和“个人资料”开箱即用。要添加自定义范围 - 按照说明 Defining resource servers for your pool
  2. 在 Cognito 用户池客户端设置中 - 选择电子邮件/配置文件或您的范围。除非您出于其他目的需要它,否则不要包含管理范围。此处选择的所有范围都将在登录时在您的 Cognito 用户访问令牌中发布的范围内。 (使用 JWT.MS 检查令牌)
  3. 在 API Gateway 中,将任何选定范围的问题添加到 OAuth 范围。如果 Bearer 令牌具有此范围 - 它将被授权。

【讨论】:

  • 我怎么做?假设我将自定义范围添加到 API 的 OAuth 范围输入,我可以从 access_token 中接收相同的范围吗?如果有办法将范围添加到 access_token 响应中,我可以只使用“电子邮件”吗?为什么要添加自定义?
  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • 而不是使用管理员范围 - 您可以使用“电子邮件”或“个人资料”。我已经修改了步骤的答案
猜你喜欢
  • 2017-12-11
  • 2022-11-05
  • 2019-08-20
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
相关资源
最近更新 更多