【发布时间】:2018-05-04 04:27:19
【问题描述】:
我有一个 API 服务,我将使用 AWS API Gateway 和 Cognito 授权器 + Lambda 作为后端来部署它。我们的 javascript 客户端将使用此服务。此外,它应该作为原始端点向最终用户公开,以便进行编程访问。
虽然使用联合身份在 js 客户端中启用注册/登录非常容易,但我不知道如何为用户提供私有访问令牌以直接包含在 http 标头中。
这里有两个身份验证流程,我想最后得到:
js客户端用户流程:
- 用户使用 Facebook 或 Google 注册。
- 用户验证其身份。
- 登录后,用户转到界面中的配置文件/API 密钥部分。
- 用户复制访问令牌并可以将其包含在任何 http 客户端(httpie、curl、语言库等)的 http 请求标头中
管理员创建用户的流程:
- 管理员创建用户。
- 为该用户生成访问令牌。
- 管理员将生成的访问令牌传递给用户。
- 用户可以将其包含在 http 标头中以发出请求,就像之前的流程一样。
访问令牌应该是永久性的,并且可以由用户随时重新生成(想想 Stripe API 访问密钥)。
这里的重点是消除用户以编程方式开始使用服务的额外步骤。到目前为止,AWS 文档中最接近的内容是 developer-authenticated-identities,但无论如何用户都应该使用 AWS sdk。
完成此任务的一种可能方法是在 API Gateway 中使用自定义授权方而不是 Cognito 授权方。自定义授权者可以基于例如实现逻辑auth 标头名称并决定在 Cognito 中授权还是在数据库中使用 API 访问令牌。我不确定是否可能,以及是否是主要缺点是在 lambda 函数中重新实现 Cognito 身份验证流程。
问题是如何使用 Cognito 或 API Gateway 完成此类 API 访问令牌(重新)生成?
【问题讨论】:
-
首先,出于安全原因,来自 Cognito 的访问令牌不应该是永久性的。不确定到底是什么问题。人们总是可以编写一个脚本来向 Cognito 请求令牌并以编程方式将其包含在 HTTP 请求中。您的意思是用户在登录一次后就再也不需要登录了吗?如果是这样,您可以随时使用刷新令牌来获取新令牌
标签: amazon-web-services authentication aws-lambda aws-api-gateway amazon-cognito