[英]Cognito Groups with IAM Permissions
我要实现的目标:
我有一个Cognito用户池,我有一些用户和一些组。 我希望某些用户可以访问API网关功能,某些用户可以访问某些功能,而其他用户则不能访问。
我做了什么:
我创建了三个组,并将用户分配给了每个组。 我给每个小组一个IAM角色,并给了每个角色特定的政策。 该组对所有用户的权限如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "execute-api:*",
"Resource": "*"
}
]
}
我通过无服务器框架创建了Lambda函数和API网关资源。 我将授权者设置为Cognito用户池授权者。
(我尝试了几种不同的方法,例如使用联合身份,但这似乎也不起作用)
我的结果是什么:
所有用户都具有对API网关的完全访问权限。 给定的权限似乎对每个用户的访问没有任何影响。
帮助:我做错了什么? 我如何实现我的目标?
仅当您使用Cognito Federated Identity
为用户生成凭据时,才会显示附加到user pool group
的角色。 将组添加到用户池
IAM角色及其权限与Amazon Cognito身份池为经过身份验证的用户提供的临时AWS凭证绑定。 当Amazon Cognito联合身份使用“从令牌中选择角色”选项提供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"
}
]
}
生成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;
}
});
}
我有一个更好的解决方案,您不需要IAM。
只需将一对{username, serviceName}
在S3或DB中。 因此,每次您都会收到服务请求:
为什么我认为更好
因为要从服务中添加/删除用户,所以您无需以管理员身份登录IAM。 希望以后,您可以创建用于管理的仪表板。
工作流程
UserA
向您的securityApi
发送请求。 SecurityApi
检查令牌是否经过授权(用户有效与否)。
如果UserA
有效,则securityApi
将username
的用户username
(可以从令牌的有效负载中获取)和service name
发送到DB,以查看用户是否有权访问该用户。 以Mysql为例(为此使用RDS):
SELECT username from ServiceX LIMIT 1 WHERE username = "xyz";
如果通过第二或第三步,则用户为1.有效用户,并且2.有权使用该服务。 如果用户在步骤2或3中失败,则该用户无权使用该服务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.