Есть ли способ с помощью CDK предоставить доступ S3 пользователю, аутентифицированному с помощью Cognito - PullRequest
1 голос
/ 06 августа 2020
• 1000 *

У меня есть оба, но я не могу найти способ предоставить аутентифицированному пользователю право загружать файл в мою корзину.

Я видел Amplify do c с указанием того, что мне нужно создать Auth_Role, который предоставляет доступ на уровне пользователя к ведру, я попробовал его, используя CfnIdentityPoolRoleAttachment, но безуспешно, я продолжаю получать 403.

Здесь это мой CDK:

    // KMS
    const ClientKmsKey = new kms.Key(this, 'ClientMasterKey', { trustAccountIdentities: true });


    // Encrypted Bucket
    const test_bucket = new s3.Bucket(this, 'bucket-name', {
      bucketName: 'bucket-name',
      encryption: s3.BucketEncryption.KMS,
      encryptionKey: ClientKmsKey,
      cors: [
        {
          allowedHeaders: [
            "*"
          ],
          allowedMethods: [
            s3.HttpMethods.POST,
            s3.HttpMethods.PUT,
            s3.HttpMethods.GET,
          ],
          allowedOrigins: [
            "*"
          ],
          exposedHeaders: [
            'x-amz-server-side-encryption',
            'x-amz-request-id',
            'x-amz-id-2',
            'ETag'
          ],
        }
      ],
    });

    // Identity Pool
    const userPool = new cognito.UserPool(this, 'AppFrontUserPool', {
      userPoolName: "AppFrontUserPool",
      selfSignUpEnabled: false,
      signInAliases: {
          email: true,
          phone: false,
          username: false
      }
    });

    const userPoolClient = userPool.addClient('app-client', 
    {
      oAuth: {
        flows : {
          implicitCodeGrant: true
        },
        scopes: [OAuthScope.OPENID, ],
        callbackUrls: ['...']
      }
    });

    const identityPool = new cognito.CfnIdentityPool(this, 'app-identity-pool', {
      allowUnauthenticatedIdentities: false,
      cognitoIdentityProviders: [{
          clientId: userPoolClient.userPoolClientId,
          providerName: userPool.userPoolProviderName,
      }]
    });


    // Role for authenticated Users
    const authenticatedRole = new iam.Role(this, 'CognitoDefaultAuthenticatedRole', {
      assumedBy: new iam.FederatedPrincipal('cognito-identity.amazonaws.com', {
          "StringEquals": { "cognito-identity.amazonaws.com:aud": identityPool.ref },
          "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" },
      }, "sts:AssumeRoleWithWebIdentity"),
    });
    authenticatedRole.addToPolicy(new iam.PolicyStatement({
        effect: iam.Effect.ALLOW,
        actions: [
          "s3:*",
          "mobileanalytics:PutEvents",
          "mobileanalytics:GetEvents",
          "cognito-sync:*"
        ],
        resources: [
          '*'
        ],
    }));

    // Role for UNauthenticated Users
    const unauthenticatedRole = new iam.Role(this, 'CognitoDefaultUnauthenticatedRole', {
      assumedBy: new iam.FederatedPrincipal('cognito-identity.amazonaws.com', {
          "StringEquals": { "cognito-identity.amazonaws.com:aud": identityPool.ref },
          "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "unauthenticated" },
      }, "sts:AssumeRoleWithWebIdentity"),
    });
    unauthenticatedRole.addToPolicy(new iam.PolicyStatement({
      effect: iam.Effect.DENY,
      actions: [
        "s3:*",
        "mobileanalytics:PutEvents",
        "mobileanalytics:GetEvents",
        "cognito-sync:*",
        "cognito-identity:*"
      ],
      resources: [
        '*'
      ],
    }));

    const defaultPolicy = new cognito.CfnIdentityPoolRoleAttachment(this, 'DefaultValid', {
        identityPoolId: identityPool.ref,
        roles: {
            'unauthenticated': unauthenticatedRole.roleArn,
            'authenticated': authenticatedRole.roleArn
        }
    });

Я использовал этот пост для создания политики Cognito: Как создать Cognito IdentityPool с Cognito UserPool в качестве одного из провайдеров аутентификации, используя aws cdk?

Я не могу найти способ проверить, действительно ли мои пользовательские роли привязаны к аутентифицированному пользователю в консоли.

Могу ли я что-то еще сделать? Могу ли я проверить в консоли, что мой пул пользователей в Cognito действительно использует мою политику?

Edit:

Вот как я пытался вызвать ведро S3 с помощью Amplify:

В конфигурации указывается только ведро и регион.

Storage.get('test_amplify.txt', { level: 'public',  ServerSideEncryption: 'aws:kms', SSEKMSKeyId: '...'})
        .then (result => console.log(result))
        .catch(err => console.log(err));
Storage.put('test_from_front.txt', 'HELLO !', { level: 'public',  ServerSideEncryption: 'aws:kms', SSEKMSKeyId: '...'})
        .then (result => console.log(result))
        .catch(err => console.log(err));
 

Storage.get('test_amplify.txt', { level: 'public' })
        .then (result => console.log(result))
        .catch(err => console.log(err));
Storage.put('test_from_front.txt', 'HELLO !')
        .then (result => console.log(result))
        .catch(err => console.log(err));

Еще 403

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...