使用 Cognito 进行 REST API 身份验证
Posted
技术标签:
【中文标题】使用 Cognito 进行 REST API 身份验证【英文标题】:Using Cognito for REST API authentication 【发布时间】:2018-08-27 13:50:25 【问题描述】:我希望使用 API Gateway + Lambda + Cognito 用户池来构建一个简单的 REST API。
API 将以两种方式使用。第一个是支持基本的 Web 应用程序(托管在 CloudFront + S3 上)。 Web 应用程序的身份验证使用托管的 Cognito 登录/注册流程,并且工作正常(通过 API 网关设置以使用用户池身份验证器)。
第二种方法是让客户使用 REST API 与系统进行通信。
例如,客户端可能使用 Web 应用配置工作流,然后使用 API 调用该工作流。
验证 API 以用于后端服务的推荐方法是什么?
传统上,我希望为此目的使用 API 密钥 + 秘密令牌。我在 API Gateway 界面中创建 API 密钥没有任何问题,但是我看不到将其链接到特定用户,也看不到任何在 API 密钥旁边指定秘密令牌的方法。
假设上述是可能的,我将如何设置它以使我可以将基于 JWT 的方法用于 Web 应用程序并使用 API 密钥 + 秘密令牌供客户使用。
编辑:此外,我注意到应用程序客户端有一个 ID 和一个秘密。它们是否打算用于第 3 次基于 API 的身份验证(类似于其他系统如何让您创建用于 API 访问的应用程序)?我有点怀疑,因为每个用户池有 25 个限制,尽管这是一个软限制......
【问题讨论】:
【参考方案1】:我自己一直在寻找这个问题的答案,我的搜索让我想到了你的问题。假设您想使用众所周知的密钥/秘密方法,我将从我的研究中给您最好的答案。也许其他人可以提供更好的方法。
基本上,方法是:
-
您的 REST API 帐户只是(可能是独立的)用户池中的 Cognito 用户
API 帐户的管理从后端完成
用户名和密码将是 API 密钥和秘密,是 administratively created(请参阅 Admin* 操作),并且可以是您想要的任何格式(在 Cognito 限制内)
REST API 是authorized via Cognito JWT tokens
API 帐户密钥和秘密仅用于检索或刷新令牌
这要求 REST API 具有一组端点,以支持使用帐户密钥和机密检索和刷新令牌
根据您设置 Cognito 刷新间隔的时间长短,您可以要求 API 帐户提交其密钥/秘密凭据from very often to almost never
构建使用 Cognito 令牌的 REST API 授权将允许您将 REST API 直接与 API Gateway's support for Cognito 集成。
我认为整个事情最令人头疼的是,您必须创建支持部分,例如,注册用户请求 API 帐户和管理这些帐户,以及一些额外的辅助 REST 端点用于令牌交换。此外,客户端必须跟踪密钥/秘密和令牌,并添加客户端逻辑以了解何时提供令牌或凭据。
【讨论】:
【参考方案2】:当我开始使用 API 网关和 Congito 时,我引用了很多 https://github.com/awslabs/aws-serverless-auth-reference-app,发现它对于演示不同 AWS 组件之间的集成非常有帮助。
【讨论】:
【参考方案3】:如果我对您的理解正确,您想创建一个“长期 API 密钥 + 秘密”以便以编程方式访问您的 API?
我正是有这种需要,但很遗憾地发现这似乎是不可能的。密钥的最长有效期为 1 小时。您可以拥有有效期为 10 年的刷新令牌。 https://docs.aws.amazon.com/cognito/latest/developerguide/limits.html
我目前正在寻找一个优雅的解决方案。我很想知道您是否找到了解决方案,或者您是否推出了自己的解决方案。
【讨论】:
以上是关于使用 Cognito 进行 REST API 身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Facebook验证使用Cognito的API调用?
如何在 API 网关中通过混合 Cognito 身份和用户池来授权 API
操作方法:使用 AWS Cognito 进行 C# .net 核心 API (APIGateway/Lambda) + Xamarin + Facebook 身份验证