簡體   English   中英

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 和/或 AWS API Gateway 等工具探索可能的架構。

目前,我的應用程序部署在 EC2 實例中,大綱如下:

前端:在端口 80 上運行的 React 應用程序。當用戶轉到https://myapp.com時,請求被定向到 my-ec2-instance:80。

后端:Nodejs + Express 運行在 3000 端口。用戶在瀏覽器中加載前端后,在與網站交互時,向https://myapp.com/api/*發送 http 請求,這些請求被路由到 my- ec2-實例:3000;

我使用 nginx/openresty 作為我的 webapp 的單個入口點,它使用 AWS Cognito 進行授權,然后根據路徑反向代理請求:

在此處輸入圖像描述

現在,我不想使用 nginx/openresty 服務來管理 EC2 實例,而是要 go 無服務器。

我打算將我的域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 根本不是為這樣的用例而構建的。

有什么建議么?

您提到了“無服務器”,但使用的是服務器 ec2。 您可以將 AWS lambda (Node JS) 用於后端,將 S3 用於前端。 AWS API 網關具有內置授權功能,您可以在其中使用 AWS Cognito。 Cloudfront 用於緩存在邊緣位置的內容交付,以便從用戶所在的最近邊緣位置更快地交付內容。

您可以按照以下步驟在 AWS 中實施無服務器概念。

  1. 創建前端並上傳到S3

  2. 配置 AWS Cognito 並獲取以下 UserPoolId:'xxxx',ClientId:'xxxx',IdentityPoolId:'xxxx',Region:'xxxx'

  3. 使用 aws-cognito-sdk.min.js 驗證用戶並獲取 JWT 令牌,示例代碼可以在這里找到。 這個 JWT 令牌需要傳遞給 header 部分中的每個 API 調用。 如果使用 AJAX 那么示例代碼是

    var xhr = new XMLHttpRequest();

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

  4. 配置 AWS API 網關和雲端 - 遵循文檔

  5. 在 API 網關配置 select Cognito 中,您想要使用授權訪問的那些 API。

  6. 為后端創建 AWS Lambda 函數並鏈接到 API 網關。

問題

感覺你目前的問題是:

  • 對 Cloudfront 的請求將需要一個 cookie,而 Cloudfront 只有非常有限的能力來運行代碼來驗證它們(通過 lambda 邊緣擴展)
  • 在 Cloudfront 前面放置反向代理是沒有意義的,因為它應該為您將 web 資源部署到 20 個左右的全球位置

解決方法

如果您可以將 web 和 API 問題分開,則可以解決您的問題:

  • 使您的 Express web 后端(在本地開發期間使用)僅提供 static 內容
  • 僅對 API 和 OAuth 請求使用反向代理和 cookies

令牌處理程序模式

在 Curity,我們整理了一些相關資源,如下圖所示:

令牌處理程序模式

從部署的角度來看,這是一個棘手的流程,盡管這個想法只是插入令牌處理程序組件,因此您的 SPA 和 API 只需要簡單的代碼,同時還可以使用最好的安全性。

AWS 代碼示例

出於興趣,我的一個 React 示例將這種模式與 Cognito 一起使用,並部署到 Cloudfront。

很少的想法。

前端:
使用 S3 + CloudFront 分配。
關於身份驗證,您可以嘗試使用 Lambda function “鏈接”到 CloudFront 分配,重定向到 Cognito。

后端:
部署在 Fargate、EC2 或您喜歡的位置。
在端點前面放置一個應用程序負載均衡器 (ALB),這樣您就可以使用重定向、轉發、拒絕等定義規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM