【问题标题】:AWS: Restrict Cognito Authorized User to specific Lambda FunctionsAWS:将 Cognito 授权用户限制为特定的 Lambda 函数
【发布时间】:2018-07-10 10:59:57
【问题描述】:

我正在使用 AWS,我有以下设置:UserPool; API 网关、Lambda 函数

api 网关使用 UserPool 授权器来保护 lambda 函数。到目前为止,这是有效的。现在我想将每个 lambda 函数限制为特定的用户组。因此,我在 CognitoPool 中创建了两个用户组(useradmin),并为每个组分配了一个特定的角色和一个策略。之后我在 UserPool 中创建了一个用户并将他添加到user 组。该用户仍然能够向每个路由/lambda 函数提交请求。

如何提交请求?

  • 邮递员
  • Authorization 标头中设置IdToken(经过身份验证的用户)
  • 如果没有 Authorization 标头,则响应为 401(如预期)
  • 带有Authorization 标头的每个 lambda 函数都可以被触发(不是预期的)

UserPool 组的配置:

  • 组用户:

    • 阿恩:Role ARN: arn:aws:iam::xxxxxx:role/User
    • UserRole 指定为

      {
        "Version": "2012-10-17",
        "Statement": [
          "Action": [
            "lambda:InvokeFunction",
            "lambda:InvokeAsync"
          ],
         "Resource": [
           "arn:aws:lambda:region:xxxxxx:function:api-dev-getItems
          ],
          "Effect": "Allow"
        ]
      }
      
  • 组管理员:

    • 阿恩:Role ARN: arn:aws:iam::xxxxxx:role/Admin
    • AdminRole 指定为

      {
        "Version": "2012-10-17",
        "Statement": [
            "Action": [
            "lambda:InvokeFunction",
            "lambda:InvokeAsync"
          ],
          "Resource": [
             "arn:aws:lambda:region:xxxxxx:function:api-dev-getItems
             "arn:aws:lambda:region:xxxxxx:function:api-dev-getUsers
          ],
          "Effect": "Allow"
        ]
      }
      

id 令牌的有效负载还包含: 'cognito:roles': [ 'arn:aws:iam::xxxxxx:role/User' ]

【问题讨论】:

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


    【解决方案1】:

    所以我找到了解决问题的方法。以下是我的经验总结:

    • Cognito Authorizer 更像是一个是/否授权器(是否经过身份验证;不评估用户组)
    • 因此我在 API Gateway 中使用 AWS IAM Authorizer,它将评估用户组角色
    • 必须通过 AWS 签名 v4 授权而不是 JWT(在 npm 上有一个邮递员插件和几个包)
    • 由于我使用的是 API 网关,我不得不将角色策略资源更改为 execute-api:Invoke

    详细说明:

    用户角色:

    {
      "Version": "2012-10-17",
      "Statement": [
        "Action": [
          "lambda:InvokeFunction",
          "lambda:InvokeAsync"
        ],
       "Resource": [
         "arn:aws:execute-api:region:accountid:api-id/stage/GET/items
        ],
        "Effect": "Allow"
      ]
    }
    

    管理员角色:

    {
      "Version": "2012-10-17",
      "Statement": [
        "Action": [
          "lambda:InvokeFunction",
          "lambda:InvokeAsync"
        ],
       "Resource": [
         "arn:aws:execute-api:region:accountid:api-id/stage/GET/items
         "arn:aws:execute-api:region:accountid:api-id/stage/*/users
        ],
        "Effect": "Allow"
      ]
    }
    

    我不得不使用 Postman AWS 签名,而不是将 ID 令牌传递到 Authorization 标头,这至少需要一个 AccessKey 和一个 SecretKey。当我使用 aws-sdk 登录我的用户时,可以检索这两个。 aws-sdk-js 以 TypeScript 为例:

    import { CognitoUserPool, CognitoUser, AuthenticationDetails } from 'amazon-cognito-identity-js';
    
    const userPool = new CognitoUserPool({
      UserPoolId: 'my pool id',
      ClientId: 'my client id'
    });
    
    function signIn(username: string, password: string) {
      const authData = {
        Username: username,
        Password: password,
      };
    
      const authDetails = new AuthenticationDetails(authData);
      const userData = {
        Username: username,
        Pool: userPool,
      };
    
      const cognitoUser = new CognitoUser(userData);
      cognitoUser.authenticateUser(authDetails, {
        onSuccess: (result) => {
          const cognitoIdpKey = `cognito-idp.${region}.amazonaws.com/${userPool.getUserPoolId()}`;
    
          const credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: 'identity pool id,
            Logins: {
              [cognitoIdpKey]: result.getIdToken().getJwtToken(),
            }
          });
          AWS.config.update({
            credentials,
          });
    
          credentials.refreshPromise()
            .then(() => {
              console.log('Success refresh. Required data:', (credentials as any).data.Credentials);
            })
            .catch(err => console.error('credentials refresh', err));
        }
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2019-12-12
      • 2021-10-01
      • 2021-10-22
      • 2022-11-10
      • 2019-10-21
      相关资源
      最近更新 更多