簡體   English   中英

如何僅允許 AWS Cognito 用戶從 S3 下載文件?

[英]How to allow downloading files from S3 only to AWS Cognito users?

在我的 AWS 項目中,我使用 Cognito 允許經過身份驗證和未經身份驗證的用戶使用我的 Android 應用程序。 我還使用 S3 來存儲用戶可以從應用程序下載的文件。

這是我的 S3 存儲桶的內容:

myS3Bucket:
   - folderAll
   - folderUserGroup

在該存儲桶中, folderAll包含可由我的應用程序的每個用戶下載的文件, folderUserGroup包含只能由特定 Cognito 用戶組中的經過身份驗證的用戶下載的文件。

無論的文件folderAll也沒有的文件folderUserGroup應該被允許的應用程序的下載外,例如使用Web瀏覽器。

我已經配置了一個 Cognito 用戶池和身份池,其中包含經過身份驗證和未經身份驗證的用戶的角色,例如經過身份驗證的用戶角色:

  MyIdentityPoolRoleAuthenticated:
    Type: AWS::IAM::Role
    Properties:
      RoleName: my-identity-pool-authenticated
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: 'Allow'
            Principal:
              Federated: 'cognito-identity.amazonaws.com'
            Action:
              - 'sts:AssumeRoleWithWebIdentity'
            Condition:
              StringEquals:
                'cognito-identity.amazonaws.com:aud':
                  Ref: MyIdentityPool
              'ForAnyValue:StringLike':
                'cognito-identity.amazonaws.com:amr': authenticated
      Policies:
        - PolicyName: 'MyIdentityPoolRoleAuthenticatedPolicy'
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: 'Allow'
                Action:
                  - 'mobileanalytics:PutEvents'
                  - 'cognito-sync:*'
                  - 'cognito-identity:*'
                Resource: '*'
              - Effect: "Allow"
                Action:
                  - "s3:GetObject"
                Resource: "arn:aws:s3:::myS3Bucket/*"

所以我試圖遵循這個這個,但我不明白如何配置 S3 和 Cognito 角色和策略來滿足我的需要。

如何配置我的角色和策略以限制文件下載僅限我的 Cognito 用戶?

謝謝你的幫助。

我不太記得你是如何直接使用 S3 策略/IAM 來做的,但我喜歡通過 AWS API Gateway 路由我所有經過身份驗證的流量,因為它與 Cognito 有很好的集成。

然后,您可以通過 API Gateway 設置 S3 代理(大量 google 資源),並告訴 API Gateway 僅允許經過身份驗證的用戶查看 s3 內容。 您可以在 api 網關中使用“授權人”來執行此操作。 不需要代碼。 直接與 cognito 集成。

我一直覺得這是讓用戶訪問受限內容的最佳實踐方式。 我認為有一些方法可以通過 Congnito 賦予實際的 IAM 角色,但這總是讓我感到不舒服。 對我來說,Cognito 的用例是將您的“用戶”全部集中在一個地方。 我喜歡讓 API Gateway 負責與 Cognito 集成並控制對受限區域的訪問 - 對我來說這是最明顯的方式。

該解決方案過於復雜,無法在此提供完整的解決方案。 AWS 在公開 API 方法以訪問存儲桶中的 Amazon S3 對象以及如何使用 Amazon Cognito 用戶池作為授權方控制對 REST API 的訪問方面提供以下資源

為了僅允許您的 AWS Cognito 池用戶訪問您的存儲桶,您可以創建如下所示的策略。 你只需要替換你自己的bucket-nameapplication-name

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "ListYourObjects",
        "Effect": "Allow",
        "Action": "s3:ListBucket",
        "Resource": ["arn:aws:s3:::bucket-name"],
        "Condition": {
            "StringLike": {
                "s3:prefix": ["cognito/application-name/${cognito-identity.amazonaws.com:sub}"]
            }
        }
    },
    {
        "Sid": "ReadWriteDeleteYourObjects",
        "Effect": "Allow",
        "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/cognito/application-name/${cognito-identity.amazonaws.com:sub}",
            "arn:aws:s3:::bucket-name/cognito/application-name/${cognito-identity.amazonaws.com:sub}/*"
        ]
    }
]

}

參考

  1. https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_s3_cognito-bucket.html

暫無
暫無

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

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