无权使用 Cognito 用户执行 AssumeRoleWithWebIdentity
Not authorized to perform AssumeRoleWithWebIdentity with Cognito User
通过 AWS-Cognito-Identity-Js,我获得了经过身份验证的 Cognito 用户的会话 ID 令牌 session.getIdToken().getJwtToken()
。
我将此 token
传递给我的 AWSInitialize
函数并更新 AWS 凭证:
var AWSInitialize = function(token){
Logins = {};
Logins['cognito-idp.' + AWSCognito.config.region + '.amazonaws.com/' + poolData.UserPoolId] = token;
AWS.config.update({
region: AWSCognito.config.region,
credentials: new AWS.CognitoIdentityCredentials({
IdentityPoolId : identityPoolId,
region: AWSCognito.config.region,
Logins : Logins
})
});
};
这可以正常工作,因为现在我可以代表经过身份验证的 Cognito 用户执行 Lambda 函数。
var lambda = new AWS.Lambda({});
lambda.invoke({FunctionName: 'createToken'}, function(err, data) ...
这是可能的,因为在 Cognito_myAppAuth_Role
中我附上了允许我执行此 Lambda 函数的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1471300653000",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:eu-west-1:593845191076:function:createToken"
]
}
]
}
现在我要做的是为相同的用户获取带有 STS 的令牌
为此,我将另一项政策附加到 Cognito_myAppAuth_Role
。它应该允许 Cognito 用户调用 assumeRoleWithWebIdentity
:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1472560044000",
"Effect": "Allow",
"Action": [
"sts:*"
],
"Resource": [
"*"
]
}
]
}
但是当我运行这个代码时:
var sts = new AWS.STS({});
var params = {
RoleArn: 'arn:aws:iam::593845191076:role/Cognito_myAppAuth_Role', /* required */
RoleSessionName: "UserName", /* required */
WebIdentityToken: token, /* required */
};
sts.assumeRoleWithWebIdentity(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
我收到以下错误:
AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity
我不明白为什么用户无权执行sts:AssumeRoleWithWebIdentity。对于经过身份验证的角色,我附加了一个 STS 策略,并且 Lambda-Policy 也适用于用户
问题出在哪里? 我该如何解决这个问题?
非常感谢!
我怀疑此失败的原因是您试图将 Cognito 您的用户池令牌直接与 STS 一起使用。虽然我不再直接在 Cognito 上工作,但我认为这不会奏效。
您应该尝试以下方法之一:
- (推荐) 使用 Cognito 联合身份调用
GetId
和 GetCredentialsForIdentity
获取您的临时凭证。这就是您的第一个代码块在幕后所做的事情。
- 使用 Cognito 联合身份调用
GetId
和 GetOpenIdToken
,然后在您的 AssumeRoleForWebIdentity
调用中使用 that 令牌。
希望对您有所帮助。
通过 AWS-Cognito-Identity-Js,我获得了经过身份验证的 Cognito 用户的会话 ID 令牌 session.getIdToken().getJwtToken()
。
我将此 token
传递给我的 AWSInitialize
函数并更新 AWS 凭证:
var AWSInitialize = function(token){
Logins = {};
Logins['cognito-idp.' + AWSCognito.config.region + '.amazonaws.com/' + poolData.UserPoolId] = token;
AWS.config.update({
region: AWSCognito.config.region,
credentials: new AWS.CognitoIdentityCredentials({
IdentityPoolId : identityPoolId,
region: AWSCognito.config.region,
Logins : Logins
})
});
};
这可以正常工作,因为现在我可以代表经过身份验证的 Cognito 用户执行 Lambda 函数。
var lambda = new AWS.Lambda({});
lambda.invoke({FunctionName: 'createToken'}, function(err, data) ...
这是可能的,因为在 Cognito_myAppAuth_Role
中我附上了允许我执行此 Lambda 函数的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1471300653000",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:eu-west-1:593845191076:function:createToken"
]
}
]
}
现在我要做的是为相同的用户获取带有 STS 的令牌
为此,我将另一项政策附加到 Cognito_myAppAuth_Role
。它应该允许 Cognito 用户调用 assumeRoleWithWebIdentity
:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1472560044000",
"Effect": "Allow",
"Action": [
"sts:*"
],
"Resource": [
"*"
]
}
]
}
但是当我运行这个代码时:
var sts = new AWS.STS({});
var params = {
RoleArn: 'arn:aws:iam::593845191076:role/Cognito_myAppAuth_Role', /* required */
RoleSessionName: "UserName", /* required */
WebIdentityToken: token, /* required */
};
sts.assumeRoleWithWebIdentity(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
我收到以下错误:
AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity
我不明白为什么用户无权执行sts:AssumeRoleWithWebIdentity。对于经过身份验证的角色,我附加了一个 STS 策略,并且 Lambda-Policy 也适用于用户
问题出在哪里? 我该如何解决这个问题?
非常感谢!
我怀疑此失败的原因是您试图将 Cognito 您的用户池令牌直接与 STS 一起使用。虽然我不再直接在 Cognito 上工作,但我认为这不会奏效。
您应该尝试以下方法之一:
- (推荐) 使用 Cognito 联合身份调用
GetId
和GetCredentialsForIdentity
获取您的临时凭证。这就是您的第一个代码块在幕后所做的事情。 - 使用 Cognito 联合身份调用
GetId
和GetOpenIdToken
,然后在您的AssumeRoleForWebIdentity
调用中使用 that 令牌。
希望对您有所帮助。