使用Cognito进行REST API身份验证

13

我希望使用API Gateway + Lambda + Cognito用户池来构建一个简单的REST API。

这个API将有两种用途。第一种是支持基本的Web应用程序(托管在CloudFront + S3上)。Web应用程序的身份验证使用Cognito登录/注册流程并托管,已经可以正常工作(通过API网关设置为使用用户池认证器)。

第二种方法是让客户使用REST API与系统通信。

例如,客户端可能使用Web应用程序配置工作流程,然后使用API调用该工作流程。

什么是推荐的方法来验证API以与后端服务一起使用?

传统上,我期望使用API密钥+密钥令牌来实现此目的。我没有问题在API Gateway界面中创建API密钥,但我无法看到任何方式将其链接到特定用户,也无法看到指定API密钥旁边的秘密令牌的任何方法。

假设上述内容是可能的,那么我如何设置它以便可以在Web应用程序上使用基于JWT的方法,并在API密钥+秘密令牌用于客户时使用。

编辑:此外,我注意到应用程序客户端具有ID和密钥。它们是否打算用于第三方API身份验证(类似于其他系统让您创建应用程序以进行API访问的方式)?我有些怀疑,因为每个用户池限制25个应用程序客户端,尽管它是软限制...

4个回答

6

我自己一直在寻找答案,我的搜索导致了我找到了你的问题。从我的研究中,我会给出我最好的答案,假设你想使用众所周知的key/secret方法。或许其他人可以提供更好的方法。

基本上,这种方法是:

  1. 您的 REST API 账户只是 Cognito 用户,位于(可能分开的)用户池中。
    • API 账户的管理是从后端进行的。
    • 用户名和密码将作为 API 密钥和密钥,并且是 由管理员创建(请参阅 Admin* 操作),可以使用您想要的任何格式(在 Cognito 限制内)。
  2. REST API 通过 Cognito JWT 令牌进行授权
  3. API 账户密钥和密钥仅用于检索或刷新令牌。
    • 这需要 REST API 具有一组支持使用账户键和密钥检索和刷新令牌的端点。
    • 根据您设置 Cognito 刷新间隔的时间长短,您可以要求 API 帐户提交他们的密钥/密钥凭据 非常频繁到几乎不需要

将REST API的授权结构化为使用Cognito令牌,将允许您直接将REST API与API Gateway对Cognito的支持集成。

我认为整个过程中最大的头疼问题是,您将不得不创建支持部件,例如,注册用户请求API帐户和管理这些帐户,以及一些额外的辅助REST端点用于令牌交换。此外,客户端还必须跟踪密钥/密码和令牌,并添加客户端逻辑以知道何时提供令牌或凭据。


1
如果我理解正确,您想创建一个“长期API密钥+秘钥”,以便以编程方式访问您的API?
我确实有这个需求,但很遗憾似乎不可能。密钥的最长有效期为1小时。您可以拥有一个有效期为10年的刷新令牌。https://docs.aws.amazon.com/cognito/latest/developerguide/limits.html 我正在寻找一个优雅的解决方案。如果您找到了解决方案,或者自己解决了问题,我很感兴趣听听您的经验。

1

0

有人找到更优雅的解决方案了吗?

第一个答案似乎把太多的工作推给了我的客户。我不知道调用我的 API 的开发人员的技能水平,我也不希望任何人成为 Cognito 开发人员。更严肃的是,我不想让他们存储多个信息,然后再处理刷新令牌。

我可能会考虑给他们一个刷新令牌。然后我可以做以下两件事之一:

  1. 给他们一个刷新方法。我会弄清楚所有奇怪的 Cognito 问题,并将他们的方法简化为只包含刷新令牌的简单有效负载。我会返回给他们要在后续调用中使用的访问令牌。
  2. 让他们将刷新令牌传递给我,就像它是访问令牌一样。我会在每次调用时使用它来获取访问令牌,然后使用该令牌调用内部 API。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接