簡體   English   中英

AWS Cognito-限制靜態S3網站的部分用戶登錄

[英]AWS Cognito - Restrict Parts of Static S3 Website to Logged in Users

我正在構建一個我在s3上托管的小型靜態網站。 我使用Cognito來啟動並運行一些基本的用戶驗證(登錄,注銷)。 我想將網站的某些部分限制為僅登錄用戶。

我通過本研討會的模塊2進行工作https://github.com/aws-samples/aws-serverless-workshops/tree/master/WebApplication 在本研討會中,頁面/rides.html僅限登錄用戶。 如果您尚未登錄並嘗試訪問/rides.html ,則該頁面將開始加載,然后快速將您重定向到/signin.html 這樣做的問題在於,未經授權的用戶仍然可以在進行重定向之前一瞬間看到乘車頁面。

這是他們的代碼,用於重定向尚未登錄的用戶。當用戶嘗試訪問/rides.html時,它將作為javascript運行。

   WildRydes.authToken.then(function setAuthToken(token) {
       if (token) {
           authToken = token;
       } else {
           window.location.href = '/signin.html';
       }
   }).catch(function handleTokenError(error) {
       alert(error);
       window.location.href = '/signin.html';
   });

我在確定最好的方法以確保只有已登錄的用戶才能訪問我的網站的某些部分時遇到了很多麻煩。 對於與Webdev / AWS相關的任何事物來說都是非常新的東西,我在網上查找此信息時遇到了一些麻煩。

編輯:清除我要實現的目標-我希望rides.html任何人都無法訪問整個rides.html頁面。

解決方案:我們最終將受限制的CloudFront放在s3存儲桶的前面。 然后,當有人嘗試訪問CloudFront時,我們觸發了一個lambda。 這是一個教程: https : //douglasduhaime.com/posts/s3-lambda-auth.html

我沒有完成您提到的研討會的全部工作,但是通過閱讀模塊2的自述文件,我了解到他們正在使用Amazon Cognito用戶池實施用戶身份驗證和注冊

從無法訪問的站點重定向是可以的,您必須確保永遠不會加載它。 讓我解釋一下原因:

站點上顯示的“敏感”信息不是靜態的 它是從模塊4中的REST后端加載的。由於身份驗證是通過JWT進行的,因此如果用戶未通過身份驗證,則永遠不會從REST后端加載數據。

那么/rides.html頁面/rides.html該做什么?

  • 如果用戶已通過身份驗證(即已獲得有效的JWT),則應調用REST后端以獲取數據
  • 如果用戶未通過身份驗證(即不存在JWT)或JWT存在並且不再有效,則應將用戶重定向到登錄頁面; 請注意,重定向之前未從REST后端獲得任何有意義的數據

編輯:

為了限制對S3中單個對象的訪問,您可以向s3存儲桶中添加類似於以下存儲桶策略的存儲桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<your-bucket-name>/*"
        },
        {
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "<your-user-arn>"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<your-bucket-name>/rides.html"
        }
    ]
}

這將使除rides.html文件之外的所有對象公開。 如果要訪問它,則必須使用簽名的URL。 [1]
請注意,不得將桶或對象ACL與這種方法結合使用,該桶或對象ACL授予所有人公開訪問權限,因為這可能會阻止對象保持私有狀態。

另一種方法(用於使用聯盟用戶而不是常規IAM用戶)

由於文檔[2]中的限制,我不知道以下方法是否可行,但是您可以嘗試一下。
可以在NotPrincipal屬性中使用Web身份聯合身份驗證提供程序: "Federated": "cognito-identity.amazonaws.com" 然后,您可以通過條件鍵(例如cognito-identity.amazonaws.com:sub )來縮小哪個聯盟用戶可以訪問rides.html對象。 [3]

[1] https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html

[2] https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html

[3] https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html

暫無
暫無

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

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