【问题标题】:AWS:如何使用 AWS Cognito 为 Cloudfront 和 EC2 实例托管的 Web 应用程序提供授权服务?
【发布时间】:2022-01-23 16:33:08
【问题描述】:

我是 AWS 新手,我只是使用 AWS cognito、AWS Cloudfront 和/或 AWS API Gateway 等工具探索可能的架构。

目前,我的应用部署在 EC2 实例中,大纲如下:

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

后端:Nodejs + Express运行在3000端口。用户在浏览器中加载前端后,与网站交互时,发送http请求到https://myapp.com/api/*,路由到my-ec2-instance: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 根本不适合这样的用例。

有什么建议吗?

【问题讨论】:

    标签: amazon-web-services oauth-2.0 amazon-cognito openid-connect amazon-cloudfront


    【解决方案1】:

    问题

    感觉你目前的问题是:

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

    解决方法

    如果您可以将 Web 和 API 问题分开,则可以解决您的问题:

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

    令牌处理程序模式

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

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

    AWS 代码示例

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

    【讨论】:

      【解决方案2】:

      您提到了“无服务器”,但使用的是服务器 ec2。您可以将 AWS lambda (Node JS) 用于后端,将 S3 用于前端。 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 令牌传递给标头部分中的每个 API 调用。如果使用 AJAX 那么示例代码是

        var xhr = new XMLHttpRequest();

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

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

      5. 在 API Gateway 配置中,为您要使用授权访问的那些 API 选择 Cognito。

      6. 为后端创建 AWS Lambda 函数并链接到 API Gateway。

      【讨论】:

        【解决方案3】:

        一些想法。

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

        后端:
        部署在 Fargate、EC2 或您喜欢的位置。
        在端点前面放置一个应用负载均衡器 (ALB),这样您就可以定义重定向、转发、拒绝等规则。

        【讨论】:

          猜你喜欢
          • 2018-08-07
          • 2019-12-22
          • 2017-03-22
          • 2020-02-21
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 2021-07-18
          相关资源
          最近更新 更多