Ошибка при загрузке файла в S3 с федеративным удостоверением с использованием aws -amplify в React - PullRequest
1 голос
/ 23 апреля 2020

Когда пользователь с федеративным удостоверением Facebook пытается загрузить изображение, я получаю сообщение об ошибке: AWSS3Provider - ошибка загрузки Ошибка: «Запрос не выполнен с кодом состояния 403» Код состояния: 403 Запрещено

Заметил этот URL в запросе, пока пользователь проходит проверку подлинности с помощью федеративной идентификации (Facebook), выглядит: URL запроса: https://my-gallery-api-dev-photorepos3bucket-XXXX.s3.us-east-2.amazonaws.com/private/undefined/1587639369473-image.jpg?x-id=PutObject

Папка, в которую будет помещено загруженное изображение, имеет вид 'undefined' вместо того, чтобы быть действительным идентификатором пользователя, как для пользователей, аутентифицированных с помощью AWS UserPool, см .: URL запроса: https://my-gallery-api-dev-photorepos3bucket-XXXX.s3.us-east-2.amazonaws.com/private/us-east-2%3Aa2991437-264a-4652-a239-XXXXXXXXXXXX/1587636945392-image.jpg?x-id=PutObject

Для аутентификации и загрузки я использую React aws зависимость "aws-amplify": "^3.0.8"

Аутентификация Facebook (кнопка Facebook):

async handleResponse(data) {
    console.log("FB Response data:", data);
    const { userID, accessToken: token, expiresIn } = data;
    const expires_at = expiresIn * 1000 + new Date().getTime();
    const user = { userID };

    this.setState({ isLoading: true });
    console.log("User:", user);
    try {
      const response = await Auth.federatedSignIn(
        "facebook",
        { token, expires_at },
        user
      );
      this.setState({ isLoading: false });
      console.log("federatedSignIn Response:", response);
      this.props.onLogin(response);
    } catch (e) {
      this.setState({ isLoading: false })
      console.log("federatedSignIn Exception:", e);
      alert(e.message);
      this.handleError(e);
    }
  }

Загрузка:

import { Storage } from "aws-amplify";

export async function s3Upload(file) {
  const filename = `${Date.now()}-${file.name}`;

  const stored = await Storage.vault.put(filename, file, {
    contentType: file.type
  });

  return stored.key;
}
     const attachment = this.file
        ? await s3Upload(this.file)
        : null;

Я понимаю, что отказ от S3 с 403 из-за роли IAM у меня для аутентифицированных пользователей:

  # IAM role used for authenticated users
  CognitoAuthRole:
    Type: AWS::IAM::Role
    Properties:
      Path: /
      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: CognitoIdentityPool
              'ForAnyValue:StringLike':
                'cognito-identity.amazonaws.com:amr': authenticated
      Policies:
        - PolicyName: 'CognitoAuthorizedPolicy'
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: 'Allow'
                Action:
                  - 'mobileanalytics:PutEvents'
                  - 'cognito-sync:*'
                  - 'cognito-identity:*'
                Resource: '*'

              # Allow users to invoke our API
              - Effect: 'Allow'
                Action:
                  - 'execute-api:Invoke'
                Resource:
                  Fn::Join:
                    - ''
                    -
                      - 'arn:aws:execute-api:'
                      - Ref: AWS::Region
                      - ':'
                      - Ref: AWS::AccountId
                      - ':'
                      - Ref: ApiGatewayRestApi
                      - '/*'

              # Allow users to upload attachments to their
              # folder inside our S3 bucket
              - Effect: 'Allow'
                Action:
                  - 's3:*'
                Resource:
                  - Fn::Join:
                    - ''
                    -
                      - Fn::GetAtt: [PhotoRepoS3Bucket, Arn]
                      - '/private/**${cognito-identity.amazonaws.com:sub}/***'
                  - Fn::Join:
                    - ''
                    -
                      - Fn::GetAtt: [PhotoRepoS3Bucket, Arn]
                      - '/private/**${cognito-identity.amazonaws.com:sub}**'

Работает нормально для пользователей, зарегистрированных в AWS Пул пользователей (электронная почта, пароль), но для федеративных пользователей запись в AWS Пуле пользователей отсутствует только в федеративных удостоверениях, поэтому cognito- не будет. identity.amazon aws .com: sub найден для этих пользователей, а каталог 'undefined' не попадает в допуск роли для пользователя, идентифицированного с помощью Federated Identity.

Пожалуйста, сообщите: 1. Где / как исправить это 'undefined' в URL? 2. Кроме того, я хотел бы, вероятно, заменить эти идентификаторы в URL-адресе загрузки на генерируемые идентификаторы пользователей из базы данных пользователей, которые я собираюсь добавить в ближайшем будущем. Как исправить роль IAM для использования пользовательских идентификаторов?

...