Базовая аутентификация AWS без специальной авторизации
У меня проблема с настройкой базовой аутентификации для моей лямбда-функции AWS, написанной на Node.js.
Эта проблема:
Лямбда-функция AWS, которая является прокси для дополнительной услуги. Эта функция только перенаправляет весь запрос и дает пользователю полный ответ. Вот почему я должен заставить использование Authentication
заголовок, и я хотел бы иметь окно приглашения для передачи учетных данных: https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
Помимо прокси-части моей лямбда-функции, я сосредоточился на проблеме с аутентификацией и написал следующий код:
export const proxy = async (event) => {
const authorizationHeader = event.headers.Authorization;
if (typeof authorizationHeader === undefined) {
throw new Error("Unauthorized");
}
...
};
service:
name: proxy-auth-test
plugins:
- serverless-webpack
provider:
name: aws
runtime: nodejs8.10
memorySize: 128
timeout: 10
functions:
proxy-async:
handler: handler.proxy
events:
- http:
method: get
path: api/proxy
resources:
Resources:
GatewayResponse:
Type: 'AWS::ApiGateway::GatewayResponse'
Properties:
ResponseParameters:
gatewayresponse.header.WWW-Authenticate: "'Basic'"
ResponseType: UNAUTHORIZED
RestApiId:
Ref: 'ApiGatewayRestApi'
StatusCode: '401'
Конечная точка работает правильно, но я не могу получить окно приглашения для передачи учетных данных. Я настроил GatewayResponse
в соответствии с этим https://medium.com/@Da_vidgf/http-basic-auth-with-api-gateway-and-serverless-5ae14ad0a270 но я не хочу предоставлять дополнительную лямбда-функцию, которая отвечает только за авторизацию пользователи.
В моем случае я не могу авторизовать пользователей перед выполнением последней лямбда-функции, потому что эта функция только перенаправляет запрос (тоже учетные данные), ничего более.
Кто-нибудь когда-нибудь пытался настроить базовую аутентификацию с окном приглашения без дополнительного авторизатора с использованием безсерверной и AWS-лямбды?
2 ответа
При возврате ответа от интеграции WWW-Authenticate переназначается на X-Amzn-Remapped-WWW-Authenticate (1). Браузеры не будут обрабатывать этот переназначенный заголовок, поэтому они не отображают подсказку.
Это означает, что вам нужно переместить логику авторизации в Lambda Authorizer на уровне HTTP-запроса и вернуть "неавторизованный" обратному вызову, как указано в ссылке на среду, на которую вы ссылались. На данный момент это единственный способ вернуть заголовок WWW-Authenticate.
Источники:
1: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-known-issues.html
Вы не возвращаетесь statusCode
в ответ. Статья, которую вы читаете, похоже, использует Custom Authorizer
это всегда возвращается 401 status code
с callback('Unauthorized')
, Ваша лямбда-функция должна возвращать соответствующий код ошибки и заголовки.
if (typeof authorizationHeader === undefined) {
return {
statusCode: 401,
body: 'unauthorized',
headers: {
'WWW-Authenticate': 'Basic'
}
}
}