【问题标题】:AWS Serverless Protect API Paths for different User Roles适用于不同用户角色的 AWS Serverless Protect API 路径
【发布时间】:2018-07-05 21:18:49
【问题描述】:

现在,关于 AWS 的所有信息都让我头疼不已。 :) 所以我需要你的帮助。

我在 AWS 上有以下架构:API Gateway、Lambda、Cognito。我正在使用无服务器框架来配置所有内容。 在 Lambda 上部署了几个函数。假设 API 和函数如下:

GET /user
GET /vehicle
POST /vehicle

我有两种类型的用户 A 和 B。A 是管理员,应该可以访问所有内容,但 B 仅限于某些路径,例如

GET /user >>> only A
GET /vehicle >>> B
POST /vehicle >>> only A

如何使用 Cognito、API Gateway 和 Lambda 实现这一目标。

到目前为止我发现的信息/想法是:

  • 可以使用不同的 IAM 角色(例如“普通用户”和“管理员”)
    • 这里我不知道在哪里以及如何将用户(存储在 Cognito 中)分配给某些角色(source1、source2)
  • 可以使用自定义授权者 (source)
    • 在这里我只能找到使用 Auth0.. 但我想使用 Cognito 的示例
  • 在 Cognito 池上使用 Pre-Token 触发器来更新令牌中的声明 (source)

最好的方法是什么?还是有更好的解决方案? 不过,一个很好的例子会很好。到目前为止,我只找到了大约 50 行代码的示例,这不适合我的情况。所以实际上我的问题可能是我不知道如何以及从哪里开始..

【问题讨论】:

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


    【解决方案1】:

    这可能有点偏颇,因为我过去曾使用过自定义授权方。 但它们可能是您提到的那些最灵活的解决方案。

    在有 cognito 授权方之前,我实际上已经将自定义授权方与 cognito 用户池一起使用。

    当时这个https://aws.amazon.com/blogs/mobile/integrating-amazon-cognito-user-pools-with-api-gateway/ 帮助了我很多开始。

    后来我发现,一旦我进行了大量验证并且用户权限不会经常更改,我应该利用授权方发送的策略的缓存。为此,我必须发送一个策略作为响应,该策略将涵盖经过身份验证的用户允许调用的所有端点。

    编辑: 在自定义授权者上,您可以check the user information by calling cognito。之后,如果它是默认用户,您可以为用户提供策略

    {   "principalId": "yyyyyyyy", // The principal user identification associated with the token sent by the client.   "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Action": "execute-api:Invoke",
            "Effect": "Allow|Deny",
            "Resource": "arn:aws:execute-api:{regionId}:{accountId}:{appId}/{stage}/GET/user"
          }
        ]   } }
    

    对于管理员,您只需发送另一个策略

    {
      "principalId": "yyyyyyyy", // The principal user identification associated with the token sent by the client.
      "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Action": "execute-api:Invoke",
            "Effect": "Allow|Deny",
            "Resource": "arn:aws:execute-api:{regionId}:{accountId}:{appId}/{stage}/GET/user"
          },
       {
            "Action": "execute-api:Invoke",
            "Effect": "Allow|Deny",
            "Resource": "arn:aws:execute-api:{regionId}:{accountId}:{appId}/{stage}/*/vehicle"
          }
        ]
      }
    }
    

    【讨论】:

    • 谢谢我看了一下,你的链接对我帮助很大!我使用了自定义授权器,但后来我决定使用 Cognito 授权器。然而,应用于用户的策略似乎不起作用.. 我有三个具有不同类型策略的组。例如。策略 default 只能调用带有 arn a 的 lambda 函数。具有该策略的用户(附加到角色)仍然可以调用每个函数。有什么想法吗?
    • 在自定义授权器上,您可以查看用户信息,从而可以查看他属于哪个组并使用相应的策略构建您的响应。
    • 用更多信息编辑了答案,这可能会有所帮助
    • 但是如果我坚持使用Cognito Authorizer,我该怎么做呢?
    • 嘿,关于我的问题的小更新。认知授权者似乎是一个是/否授权者。因此,我选择了 AWS IAM 授权方和 Cognito 用户组。有关更多信息,请参阅 stackoverflow.com/questions/48540390/… 您为自定义授权方提供的选项是另一种选择。
    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2015-11-13
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    相关资源
    最近更新 更多