Mal*_*rkb 8 user-management amazon-web-services amazon-iam amazon-cognito aws-api-gateway
我想要实现的:
我有一个 Cognito 用户池,我有一些用户和一些组。我希望某些用户可以访问 API 网关功能,某些用户可以访问某些功能,而其他用户则没有访问权限。
我做了什么:
我创建了三个组并将用户分配给每个组。我为每个组分配了一个 IAM 角色,并为每个角色分配了特定的策略。所有用户的组权限如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "execute-api:*",
"Resource": "*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我通过无服务器框架创建了 Lambda 函数和 API 网关资源。我将授权方设置为 Cognito 用户池授权方。
(我尝试了几种不同的方法,例如使用联合身份,但这似乎也不起作用)
我的结果是什么:
所有用户都拥有对 API 网关的完全访问权限。给定的权限似乎对每个用户的访问没有任何影响。
求助:我做错了什么?我怎样才能实现我的目标?
附加到 a 的角色user pool group
仅在您使用Cognito Federated Identity
. 将组添加到用户池
IAM 角色及其权限与 Amazon Cognito 身份池为经过身份验证的用户提供的临时 AWS 凭证相关联。当 Amazon Cognito Federated Identities 使用从令牌中选择角色选项提供 AWS 凭证时,组中的用户会自动分配到该组的 IAM 角色。
所以基本上
identity pool
附加到您的用户池。IAM
id_token
生成federated identity
secret key + access key + token
) 对 API 网关进行授权。现在你的角色应该受到尊重。但请注意 - 您将需要自己生成 AWS SigV4 凭证,因为出于某种原因,这不是开箱即用的。我最终使用aws-sign-web在浏览器中使用。
PS:您的角色似乎可以全面访问 API 网关。你也需要解决这个问题。例如,我用来限制对一个 API 端点的访问的示例角色
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Resource": [
"arn:aws:execute-api:us-east-2:<aws account id>:<API id>/*/*/acc/*"
],
"Effect": "Allow"
}
]
}
Run Code Online (Sandbox Code Playgroud)
要生成的示例代码 federated identity
function getAccessToken(idToken, idenPoolId, userPool) {
let region = idenPoolId.split(":")[0];
let provider = "cognito-idp." + region + ".amazonaws.com/" + userPool;
let login = {};
login[provider] = idToken;
// Add the User's Id Token to the Cognito credentials login map.
let credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: idenPoolId,
Logins: login
});
//call refresh method in order to authenticate user and get new temp credentials
credentials.get((error) => {
if (error) {
console.error(error);
//let response = {
// statusCode: 500,
// body: JSON.stringify(error)
//};
return null;
} else {
console.log('Successfully logged!');
console.log('AKI:'+ credentials.accessKeyId);
console.log('AKS:'+ credentials.secretAccessKey);
console.log('token:' + credentials.sessionToken);
let response = JSON.stringify({
'AKI': credentials.accessKeyId,
'AKS': credentials.secretAccessKey,
'token': credentials.sessionToken
});
return response;
}
});
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6757 次 |
最近记录: |