没有自定义授权方的 AWS lambda basic-authentication
AWS lambda basic-authentication without custom authorizer
我在为使用 Node.js 编写的 AWS lambda 函数设置基本身份验证时遇到问题。
问题:
AWS lambda 函数,它是附加服务的代理。该函数只转发整个请求并给用户整个响应。这就是为什么我需要强制使用 Authentication
header 并且我希望提示 window 以传递凭据:https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
除了我的 lambda 函数的代理部分外,我还专注于身份验证问题,并编写了以下代码:
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'
端点工作正常,但我无法得到传递凭据的提示window。我根据这个 https://medium.com/@Da_vidgf/http-basic-auth-with-api-gateway-and-serverless-5ae14ad0a270 设置了 GatewayResponse
但我不想提供额外的 lambda 函数,它只负责用户的授权。
在我的例子中,我不能在执行最终的 lambda 函数之前授权用户,因为这个函数只转发请求(也包括凭证),仅此而已。
有没有人尝试过使用无服务器和 AWS lambda 在没有额外授权的情况下使用提示 window 设置基本身份验证?
您没有return在回复中statusCode
。您正在关注的文章似乎使用了 Custom Authorizer
,它总是 returns 401 status code
和 callback('Unauthorized')
。您的 Lambda 函数需要 return 适当的错误代码和 headers.
if (typeof authorizationHeader === undefined) {
return {
statusCode: 401,
body: 'unauthorized',
headers: {
'WWW-Authenticate': 'Basic'
}
}
}
当 return 从集成中获取响应时,WWW-Authenticate 被重新映射到 X-Amzn-Remapped-WWW-Authenticate (1)。浏览器不会处理此重新映射 header,因此它们不会显示提示。
这意味着您必须将授权逻辑移至 HTTP 请求级别的 Lambda 授权方,并将 return 'unauthorized' 移至您在媒体 link 中所述的回调参考。这是目前 return WWW-Authenticate header 的唯一方法。
来源:
1: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-known-issues.html
我在为使用 Node.js 编写的 AWS lambda 函数设置基本身份验证时遇到问题。
问题:
AWS lambda 函数,它是附加服务的代理。该函数只转发整个请求并给用户整个响应。这就是为什么我需要强制使用 Authentication
header 并且我希望提示 window 以传递凭据:https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
除了我的 lambda 函数的代理部分外,我还专注于身份验证问题,并编写了以下代码:
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'
端点工作正常,但我无法得到传递凭据的提示window。我根据这个 https://medium.com/@Da_vidgf/http-basic-auth-with-api-gateway-and-serverless-5ae14ad0a270 设置了 GatewayResponse
但我不想提供额外的 lambda 函数,它只负责用户的授权。
在我的例子中,我不能在执行最终的 lambda 函数之前授权用户,因为这个函数只转发请求(也包括凭证),仅此而已。
有没有人尝试过使用无服务器和 AWS lambda 在没有额外授权的情况下使用提示 window 设置基本身份验证?
您没有return在回复中statusCode
。您正在关注的文章似乎使用了 Custom Authorizer
,它总是 returns 401 status code
和 callback('Unauthorized')
。您的 Lambda 函数需要 return 适当的错误代码和 headers.
if (typeof authorizationHeader === undefined) {
return {
statusCode: 401,
body: 'unauthorized',
headers: {
'WWW-Authenticate': 'Basic'
}
}
}
当 return 从集成中获取响应时,WWW-Authenticate 被重新映射到 X-Amzn-Remapped-WWW-Authenticate (1)。浏览器不会处理此重新映射 header,因此它们不会显示提示。
这意味着您必须将授权逻辑移至 HTTP 请求级别的 Lambda 授权方,并将 return 'unauthorized' 移至您在媒体 link 中所述的回调参考。这是目前 return WWW-Authenticate header 的唯一方法。
来源:
1: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-known-issues.html