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 处理。