У меня есть конечные точки шлюза API, которые выполняют лямбда-функции. Я хочу защитить свои конечные точки API с помощью aws_iam в качестве авторизатора. Для этого у меня есть пул пользователей с федеративными удостоверениями. Однако после внедрения его в шаблон cloudformation я получаю ошибку cors, вызывающую его из моего углового приложения с аутентифицированным пользователем:
Access to XMLHttpRequest at 'api endpoint url' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
вот код моего шаблона cf:
create:
handler: functions/api-create.create
events:
- http:
path: get/create
method: get
authorizer: aws_iam
cors: true
моя лямбда-функция выглядит так:
export const create = async (event, context) => {
console.info('Create: ', event)
console.info('Context: ', context)
const response = {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': true,
},
body: JSON.stringify({
product: "hallo"
}),
};
return response;
};
Без authorizer: aws_iam
все работает нормально и я получаю ожидаемый ответ. Кто-нибудь знает, что я мог пропустить здесь.
Обнаружил это сам. Вот что я сделал.
После создания ресурсов для ошибок GatewayResponsdefault они также имеют правильные заголовки с этими шаблонами в моем файле Serverless.yml:
Resources:
GatewayResponseDefault4XX:
Type: 'AWS::ApiGateway::GatewayResponse'
Properties:
ResponseParameters:
gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
ResponseType: DEFAULT_4XX
RestApiId:
Ref: 'ApiGatewayRestApi'
GatewayResponseDefault5XX:
Type: 'AWS::ApiGateway::GatewayResponse'
Properties:
ResponseParameters:
gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
ResponseType: DEFAULT_5XX
RestApiId:
Ref: 'ApiGatewayRestApi'
Ошибка, которую я получил, изменилась на ошибку 403. Теперь я включил ведение журнала наблюдения за облаком для своей конечной точки API, так как я вызывал конечную точку с авторизованным пользователем.
Там я увидел теперь ошибку:
"message": "Credential should be scoped to a valid region, not 'us-east-1'. "
После небольшого проб и ошибок я обнаружил, что, поскольку я использую amplify, мне пришлось передать регион для API при настройке amplify следующим образом:
Amplify.configure({
Auth: {
mandatorySignIn: true,
region: awsExports.cognito.REGION,
userPoolId: awsExports.cognito.USER_POOL_ID,
identityPoolId: awsExports.cognito.IDENTITY_POOL_ID,
userPoolWebClientId: awsExports.cognito.APP_CLIENT_ID,
},
API: {
endpoints: [
{
name: awsExports.api.name,
endpoint: awsExports.api.endpoint,
region: "eu-west-1" // <-- This was missing
}
]
}