AWS API Gateway:授权 Cognito 用户组

问题描述 投票:0回答:4

我是 AWS API Gateway 领域的新手,我正在尝试限制用户组对我的 API 的访问。为了澄清我已经可以运行经过身份验证的 API,问题在于授权(将一组用户限制为 API-1,将另一组用户限制为 API-2)。我正在使用 HTTP-API,我不想使用其他 API(以节省成本)。

我创建了一个 Cognito 用户池,并创建了两个名为“常规”和“管理员”的组。我还设置了一个应用程序客户端。

接下来我有两个 API 路由,它们映射到两个不同的 Lambda 函数(只是 hello world)。这些功能在没有身份验证的情况下“完美”地工作,并且在有身份验证的情况下也可以正常工作。我将 JWT-auth 与 Cognito 结合使用,出于多种原因,这是适合我的应用程序的正确方法。

问题是如何限制相关用户组对 API 的访问。因此,只有 admin-group 中的用户才能使用 admin-api。我相信红色部分可以提供帮助,但我似乎找不到正确的文档。我读到我还可以创建一个 lambda 函数来授权用户,但这似乎很浪费,如果可以在此处应用限制,为什么还要花钱购买另一个 lambda 函数。

非常感谢任何帮助。

amazon-web-services aws-api-gateway amazon-cognito
4个回答
5
投票

正如您所说,您已经使用了 Cognito 用户池并设置了一些用户组。一个简单的方法是使用

确认后 Lambda 触发器

。每当新用户得到确认时,就会触发此 Lambda。例如,当您使用外部身份提供商并且用户首次使用 Cognito 托管 UI 登录时,它甚至会被触发。在最简单的情况下,您可以使用确认后 Lambda 将用户添加到您的“常规”组。 对于 API 网关路由上的身份验证和授权,您可以将 JWT 授权方替换为自定义授权方。这意味着,您将使用 Lambda 函数来进行身份验证和授权。在 Lambda 函数中,您必须验证 JWT 令牌。如果 JWT 令牌或请求本身无效,您将引发异常并显示消息“未经授权”。 API Gateway 会将其转换为 401“未经授权”响应。如果 JWT 令牌有效,您可以对其进行解码并从中获取

cognito:groups

声明。您可以解码您的令牌并查看

jwt.io
上的声明进行测试。然后,在 Lambda 函数中,您可以检查您的用户属于哪些组以及该组是否有权访问特定路由。用户尝试访问的路线也是触发 Lambda 函数的事件的一部分。 # dummy python code if route.startswith('/adminuser') and 'admin' in cognito_groups: return { 'isAuthorized': True, 'context': { 'custom_key': 'custom_value' } } # respond with 403 "Forbidden" return { 'isAuthorized': False }

Lambda 输入和输出的有效负载可以在 
HHTP API Lambda Authorizer

文档中找到。 要更深入地了解,请查看

“使用 Amazon Cognito、API Gateway 和 IAM 构建细粒度授权”

。如需更深入地了解授权选项,我推荐 re:invent 2017 中的此视频


3
投票

这被广泛称为基于角色的访问控制(RBAC)。内置授权者不支持它,因此您必须检查处理程序中的角色/组或选择自定义授权者。


0
投票

securitySchemes: CognitoAuth: type: apiKey name: Authorization in: header x-amazon-apigateway-authtype: cognito_user_pools x-amazon-apigateway-authorizer: type: cognito_user_pools providerARNs: - 'arn:aws:cognito-idp:{region}:{account}:userpool/{pool1}' - 'arn:aws:cognito-idp:{region}:{account}:userpool/{pool2}' - 'arn:aws:cognito-idp:{region}:{account}:userpool/{pool3}'

然后,您可以自由地将组名称(作为范围)放置在全局或任何路径中。

此外,由于使用了不同的池,您将可以更好地控制每个组的策略(例如自定义属性、MFA、注册选项)。


0
投票

来源 -

https://dev.to/aws-builders/using-cognito-groups-to-control-access-to-api-endpoints-346g

总结-

您创建了两个不同的组。
  1. 流程保持不变,您使用 Cognito 用户池进行身份验证并使用令牌调用 API 网关
  2. 变化是,在 API Gateway 中添加自定义 lambda 授权者。
  3. 自定义授权人将执行以下操作 -

确保授权令牌已通过且有效。
  1. 调用 cognito 进行令牌验证。
  2. 从有效负载中提取用户:组并将其用于身份验证。示例 - 用户 admin 将始终返回经过身份验证的。对于其他组(例如免费套餐和高级组),您可以定义哪些组可以访问哪些端点。
  3. 我们可以将权限存储在 DynamoDb 表中。在后期,它被存储在内存中用于演示。

const mapGroupsToPaths = [{ path: '/movies', group: 'movies-group' }, { path: '/shows', group: 'shows-group' }];

© www.soinside.com 2019 - 2024. All rights reserved.