Amazon web services 我不明白我是如何使用AmazonCognito用户池来控制API网关RESTAPI中的访问的

Amazon web services 我不明白我是如何使用AmazonCognito用户池来控制API网关RESTAPI中的访问的,amazon-web-services,aws-lambda,amazon-cognito,Amazon Web Services,Aws Lambda,Amazon Cognito,我花了两天的时间试图理解亚马逊Cognito访问控制背后的想法,我正在尝试创建一个网站。很简单: 该网站允许用户创建帖子 任何人(匿名用户和登录用户)都应该能够看到帖子 只有已登录的用户才能创建帖子 只有原作者才能编辑自己的帖子 以下是我对亚马逊cognito的理解: Cognito用户池用于rest接口,标识池用于创建具有特定策略的临时amazon角色,以便登录到my service的用户可以直接访问aws服务,如dynamodb或s3 bucket 为了向我的rest接口发出授权请求,

我花了两天的时间试图理解亚马逊Cognito访问控制背后的想法,我正在尝试创建一个网站。很简单:

  • 该网站允许用户创建帖子
  • 任何人(匿名用户和登录用户)都应该能够看到帖子
  • 只有已登录的用户才能创建帖子
  • 只有原作者才能编辑自己的帖子
以下是我对亚马逊cognito的理解:

  • Cognito用户池用于rest接口,标识池用于创建具有特定策略的临时amazon角色,以便登录到my service的用户可以直接访问aws服务,如dynamodb或s3 bucket
  • 为了向我的rest接口发出授权请求,用户必须使用cognito UI登录并接收访问令牌,该令牌必须与每个请求一起发送到rest API以验证请求
  • 验证可以使用API网关中的cognito authorizer权限自动完成,或者将访问令牌重定向到lambda并直接在那里进行验证
  • 如果通过cognito授权人完成,则无法从lambda中读取用户名和其他信息
  • 如果我使用AWS Amplify在客户端处理请求授权,访问令牌将自动更新
但对于整个过程,我仍然有一些问题:

  • Cognito用户名保证是唯一的吗?如果没有,我如何让用户在注册或使用谷歌登录后选择保证唯一的用户名
  • 访问令牌是否等同于会话cookie
  • 如果我打算在lambda脚本中处理访问令牌,是否有我可以使用的库或服务?因为我还没有找到验证令牌或获取与令牌关联的用户的方法
  • 为什么内置授权器不将用户信息重定向到lambda脚本
  • 是否有一个我可以直接插入API网关的预构建lambda授权程序,允许登录用户和匿名用户向其发出请求,并将用户信息重定向到lambda脚本?因为我在存储库或其他任何地方都找不到

因此,我没有所有的答案,但我有一些希望能指导您:

Cognito用户名保证是唯一的吗

如果已使用用户名/电子邮件,则用户无法注册。您需要指定用户名的字段(即电子邮件或用户名)

访问令牌是否等同于会话cookie

否,访问令牌通常通过承载令牌策略在请求的
授权
报头内进行通信,并且cookie在
cookie
报头内。一些服务将验证cookie,其他服务(特别是机器对机器)将验证
授权
头。在某些情况下,开发人员可能会决定使用相同的方法,但并不总是这样

如果我打算在lambda脚本中处理访问令牌,是否有我可以使用的库或服务

如果您希望获取访问令牌的上下文(比如用户名,它被编码在JWT字符串中),那么您可以使用JWT解码函数。当请求到达lambda时,授权人已经对其进行了验证,因此您无需再次进行验证

为什么内置授权器不将用户信息重定向到lambda脚本

因为并非所有服务都需要/想要它。消费服务最好在解码令牌后对上下文执行所需的操作

是否有一个我可以直接插入API网关的预构建lambda授权程序,允许登录用户和匿名用户向其发出请求,并将用户信息重定向到lambda脚本

这个问题表明你对rest的理解有问题。API应该利用CRUD操作;因此,
Create
只能授予贡献者,
Read
可以公开授予,
Update
只能授予所有者,
Delete
只能授予所有者。以上是一个概括,但您需要一个API策略;当你制定这个策略时,你会意识到没有“简单”的按钮

通常,我会有两个API网关,一个用于只读,另一个用于管理内容。这使它保持简单,并允许您以不同的方式进行缩放(即您可能希望您的贡献者在缩放问题的情况下不会被只读使用阻止)

此外,采用基于路径的策略有助于简化谁可以获得哪些资源。以下面的例子为例:

用户向
/api/blog/
发送POST请求以创建新博客(结果是
/api/blog/:blogId
)。
/api/blog/
端点不属于任何特定贡献者。稍后,用户会更新到
/api/blog/1234 abcd
…现在,您的服务必须进行额外调用,以查看该资源是否由用户拥有(这称为“授权”过程)。在psuedo sql中,您可以
从id='1234-abcd'
的博客中选择created by,然后查看
created by
字段是否与您的用户id匹配

不管是谁,你都明白了:)如果你允许团队/多个用户修改资源,这将变得更加复杂……新的是,我们进入了RBAC(基于角色的访问控制),这是一个更长的主题


抱歉离题了,但希望这能给你更多的方向。

谢谢你的回答,它澄清了很多问题。与此同时,我发现cognito令牌是JWT令牌,它用它编码所有用户信息,所以我会将它添加到您的答案中,供其他人使用。因此,您将创建两个不同的API Gat