AWS Cognito 组和 AWS Api 网关
AWS Cognito Groups and AWS Api Gateway
我开始使用 AWS 上的无服务器,我正在使用 AWS Cognito 进行用户身份验证和授权。对于我在文档和示例中看到的内容,您可以创建允许某些用户能够使用 Api 网关端点的组,将角色和策略附加到该组。我尝试了这个,然后制作了一个简单的客户端并尝试了两个不同的用户,并且都能够获得 200 状态代码,而不是其中一个获得未授权。为了创建角色,我去了 IAM,创建角色,用于身份提供者访问的角色,授予对 Web 身份提供者的访问权限,然后我选择 Amazon Cognito 并选择我的 Cognito 用户池。
信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-1_8TAUVKbGP"
}
}
}
]
}
政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"my-arn-resourse-from-api-gateway"
]
}
]
}
然后我将这个角色分配给我的管理员组并向该组添加一个用户,这应该允许访问该 Api 网关资源,方法是在用户登录时将该策略附加到该用户。但是当我尝试与不在该组中的用户一起使用它仍然有效。顺便说一句,在请求中我的 Api 网关资源上,我对我的认知池进行了授权。
非常感谢!
对于您的用例,您需要使用 AWS_IAM 方法。此外,在这种情况下,您的所有 API 请求都需要经过 SIGv4 签名。您可以使用 Postman(chrome 扩展名)进行测试。它包括一个 AWS 凭证选项。
我试试你说的!我认为我的方法是正确的,但是 AWS.config.credentials 返回的 sessionToken 和 accessKeyId 都为 null。这是我使用的代码:
let poolData = {
UserPoolId : 'my_user_pool_id',
ClientId : 'my_app_client_id'
};
let authenticationData = {
Username : 'username',
Password : 'password',
};
let userPool = new CognitoUserPool(poolData);
let userData = {
Username : 'username',
Pool : userPool
};
let authenticationDetails = new AuthenticationDetails(authenticationData);
let cognitoUser = new CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: (result) => {
console.log(result);
AWS.config.region = 'my_region';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId : 'my_identity_pool_id',
Logins : {
'cognito-idp.my_region.amazonaws.com/my_user_pool_id' : result.getIdToken().getJwtToken()
}
});
console.log(AWS.config.credentials);
},
onFailure: (error) => {
}
});
authenticateUser 的结果returns 预期的令牌。我认为问题是在检索 CognitoIdentityCredentials 时。
非常感谢!
好的,我终于让它完美地工作了!问题出在我的 IAM 角色中,在信任关系文档中
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "identity_pool_id"
},
在那部分,我没有使用我的身份池 ID,而是使用了我的用户池 ID。修复后,我取回了凭据,并使用这些凭据在 Postman 中进行了尝试,它运行良好。然后我将同一个用户更改为另一个角色,按计划访问被拒绝了!以简单的方式使用角色授权最重要的部分,正如 agent420 所说,使用 AWS_IAM 方法来保护 api,然后其余部分由 aws 处理。
我开始使用 AWS 上的无服务器,我正在使用 AWS Cognito 进行用户身份验证和授权。对于我在文档和示例中看到的内容,您可以创建允许某些用户能够使用 Api 网关端点的组,将角色和策略附加到该组。我尝试了这个,然后制作了一个简单的客户端并尝试了两个不同的用户,并且都能够获得 200 状态代码,而不是其中一个获得未授权。为了创建角色,我去了 IAM,创建角色,用于身份提供者访问的角色,授予对 Web 身份提供者的访问权限,然后我选择 Amazon Cognito 并选择我的 Cognito 用户池。 信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-1_8TAUVKbGP"
}
}
}
]
}
政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"my-arn-resourse-from-api-gateway"
]
}
]
}
然后我将这个角色分配给我的管理员组并向该组添加一个用户,这应该允许访问该 Api 网关资源,方法是在用户登录时将该策略附加到该用户。但是当我尝试与不在该组中的用户一起使用它仍然有效。顺便说一句,在请求中我的 Api 网关资源上,我对我的认知池进行了授权。
非常感谢!
对于您的用例,您需要使用 AWS_IAM 方法。此外,在这种情况下,您的所有 API 请求都需要经过 SIGv4 签名。您可以使用 Postman(chrome 扩展名)进行测试。它包括一个 AWS 凭证选项。
我试试你说的!我认为我的方法是正确的,但是 AWS.config.credentials 返回的 sessionToken 和 accessKeyId 都为 null。这是我使用的代码:
let poolData = {
UserPoolId : 'my_user_pool_id',
ClientId : 'my_app_client_id'
};
let authenticationData = {
Username : 'username',
Password : 'password',
};
let userPool = new CognitoUserPool(poolData);
let userData = {
Username : 'username',
Pool : userPool
};
let authenticationDetails = new AuthenticationDetails(authenticationData);
let cognitoUser = new CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: (result) => {
console.log(result);
AWS.config.region = 'my_region';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId : 'my_identity_pool_id',
Logins : {
'cognito-idp.my_region.amazonaws.com/my_user_pool_id' : result.getIdToken().getJwtToken()
}
});
console.log(AWS.config.credentials);
},
onFailure: (error) => {
}
});
authenticateUser 的结果returns 预期的令牌。我认为问题是在检索 CognitoIdentityCredentials 时。
非常感谢!
好的,我终于让它完美地工作了!问题出在我的 IAM 角色中,在信任关系文档中
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "identity_pool_id"
},
在那部分,我没有使用我的身份池 ID,而是使用了我的用户池 ID。修复后,我取回了凭据,并使用这些凭据在 Postman 中进行了尝试,它运行良好。然后我将同一个用户更改为另一个角色,按计划访问被拒绝了!以简单的方式使用角色授权最重要的部分,正如 agent420 所说,使用 AWS_IAM 方法来保护 api,然后其余部分由 aws 处理。