AWS Cognito Groups和AWS Api Gateway

时间:2017-07-24 15:42:56

标签: amazon-web-services aws-api-gateway aws-cognito

我从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 Gateway资源请求中,我提出了授权我的认知池。

非常感谢!

3 个答案:

答案 0 :(得分:2)

好吧最后我让它完美地运作!问题出在我的IAM角色中,在信任关系文档中



"Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "identity_pool_id"
        },




在该部分中,我使用的是用户池ID,而不是使用我的身份池ID。修复后,我获得了凭据,并使用这些凭据在Postman中进行了尝试,并且运行良好。然后我将同一个用户更改为另一个角色,并按计划拒绝访问!在一个简单的方法中使用角色授权最重要的部分是,agent420表示使用AWS_IAM方法来保护api,然后其余部分由aws处理。

答案 1 :(得分:0)

您需要使用AWS_IAM方法代替您的用例。此外,在这种情况下,您的所有API请求都需要进行SIGv4签名。您可以使用Postman(chrome扩展名)进行测试。它包括AWS凭证选项。

答案 2 :(得分:0)

我试试你说的话!我认为我的方式正确,但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的结果返回预期的标记。我认为问题在于检索CognitoIdentityCredentials。

非常感谢!