Когда пользователь с федеративным удостоверением 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 для использования пользовательских идентификаторов?