【发布时间】: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