AWS:如何使用 AWS Cognito 为 Cloudfront 和 EC2 实例托管的 Web 应用程序提供授权服务?

AWS: How can I use AWS Cognito to provide authorization service for a webapp hosted by Cloudfront and EC2 instances?

我是 AWS 的新手,只是使用 AWS Cognito、AWS Cloudfront、and/or AWS API 网关等工具探索可能的架构。

目前,我的应用程序部署在 EC2 实例中,概要如下:

前端:React 应用程序 运行 在端口 80 上。当用户转到 https://myapp.com 时,请求被定向到 my-ec2-instance:80。

后端:Nodejs + Express 运行,端口3000。用户在浏览器中加载前端后,与网站交互时,http请求发送到https://myapp.com/api/*,路由到我的 ec2 实例:3000;

我使用 nginx/openresty 作为我的 webapp 的单一入口点,它使用 AWS Cognito 进行授权,然后根据路径反向代理请求:

现在,我不想使用 nginx/openresty 服务来管理 EC2 实例,而是想使用无服务器。

我计划将我的域 myapp.com 指向 AWS CloudFront,然后 Cloudfront 充当单一入口点以替换 Nginx/Openresty 的功能。它应该执行以下操作:

  1. AWS Cognito 授权:
    当用户首次访问 myapp.com 时,他会从 AWS Cloudfront 定向到 AWS Cognito 以完成登录步骤。

  2. 基于路径的反向代理:我知道这可以做到。我可以从 CloudFront 配置页面进行配置。

但是对于 1,Cloudfront 可以使用 AWS Cognito 进行授权吗?这是使用 AWS Cloudfront 的正确方法吗?

阅读 AWS 文档并尝试使用 Cloudfront 配置后,我开始认为 Cloudfront 根本不是为此类用例构建的。

有什么建议吗?

没什么想法。

前端:
使用 S3 + CloudFront 分配。
关于身份验证,您可以尝试使用“链接”到 CloudFront 分配的 Lambda 函数,重定向到 Cognito。

后端:
在 Fargate、EC2 上部署还是您更喜欢。
在端点前面放置应用程序负载均衡器 (ALB),以便您可以定义重定向、转发、拒绝等规则。

您提到了“无服务器”,但使用的是作为服务器的 ec2。您可以将 AWS lambda (Node JS) 用于后端,将 S3 用于 front-end。 AWS API 网关内置了授权功能,您可以在其中使用 AWS Cognito。 Cloudfront 用于缓存在边缘位置的内容交付,以更快地从用户所在的最近边缘位置交付内容。

您可以按照以下步骤在 AWS 中实现无服务器概念。

  1. 创建前端并上传到S3

  2. 配置 AWS Cognito 并获取以下内容 UserPoolId: 'xxxx', ClientId: 'xxxx', IdentityPoolId: 'xxxx', 地区:'xxxx'

  3. 使用aws-cognito-sdk.min.js验证用户并获取JWT令牌,示例代码可在here找到。此 JWT 令牌需要传递给 header 部分中的每个 API 调用。如果使用 AJAX 那么示例代码是

    var xhr = new XMLHttpRequest();

    xhr.setRequestHeader("授权", idToken);

  4. 配置 AWS API 网关和云端 - 关注 documentation

  5. 在 API 网关配置中 select Cognito 用于那些 API 您想要使用授权访问的。

  6. 为后端和 link 创建 AWS Lambda 函数到 API 网关。

问题

感觉你现在的问题是:

  • 对 Cloudfront 的请求将需要一个 cookie,而 Cloudfront 对 运行 代码的验证能力非常有限(通过 lambda 边缘扩展)
  • 在 Cloudfront 前面放置反向代理没有意义,因为它应该为您将 Web 资源部署到 20 个左右的全球位置

解决方法

如果您可以将网络和 API 问题分开,您就可以解决您的问题:

  • 使您的 Express 网络后端(在本地开发期间使用)仅提供静态内容
  • 仅对 API 和 OAuth 请求使用反向代理和 cookies

令牌处理程序模式

在 Curity,我们整理了一些 related resources,如下图所示:

从部署的角度来看,这是一个棘手的流程,尽管其想法是仅插入令牌处理程序组件,以便您的 SPA 和 APIs 只需要简单的代码,同时还使用最好的安全性.

AWS 代码示例

出于兴趣,React sample of mine 将此模式与 Cognito 结合使用,并部署到 Cloudfront。