【问题标题】:AWS lambda basic-authentication without custom authorizer没有自定义授权者的 AWS lambda 基本身份验证
【发布时间】:2019-06-27 10:34:36
【问题描述】:

我在为用 Node.js 编写的 AWS lambda 函数设置基本身份验证时遇到问题。

问题:
AWS lambda 函数,它是附加服务的代理。这个函数只转发整个请求并给用户整个响应。这就是为什么我需要强制使用 Authentication 标头,并且我希望有提示窗口来传递凭据: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'

端点工作正常,但我无法获得传递凭据的提示窗口。我根据这个https://medium.com/@Da_vidgf/http-basic-auth-with-api-gateway-and-serverless-5ae14ad0a270设置了GatewayResponse,但我不想提供只负责用户授权的额外lambda函数。

在我的例子中,我不能在执行最终的 lambda 函数之前授权用户,因为这个函数只转发请求(也包括凭据),仅此而已。

有没有人尝试过使用无服务器和 AWS lambda 在没有额外授权的情况下使用提示窗口设置基本身份验证?

【问题讨论】:

    标签: node.js aws-lambda basic-authentication serverless


    【解决方案1】:

    当从集成返回响应时,WWW-Authenticate 被重新映射到 X-Amzn-Remapped-WWW-Authenticate (1)。浏览器不会处理这个重新映射的标头,因此它们不会显示提示。

    这意味着您必须在 HTTP 请求级别将您的授权逻辑移动到 Lambda 授权方,并将“未授权”返回给回调,如您引用的媒体链接中所述。这是目前返回 WWW-Authenticate 标头的唯一方法。

    来源:

    1:https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-known-issues.html

    【讨论】:

    • 非常感谢!!!这是我真正想在这个问题下阅读的内容。最初,我想以另一种方式执行此操作,但最后,我创建了自定义授权方,它按预期工作。
    【解决方案2】:

    您没有在响应中返回statusCode。您关注的文章似乎使用了Custom Authorizer,它总是返回401 status codecallback('Unauthorized')。您的 Lambda 函数需要返回适当的错误代码和标头。

    if (typeof authorizationHeader === undefined) {
        return {
            statusCode: 401,
            body: 'unauthorized',
            headers: {
                'WWW-Authenticate': 'Basic'
            }
        }
    }
    

    【讨论】:

    • 你之前测试过吗?您提供的代码无法正常工作,并且标头部分不符合类型:[header: string]: boolean | number | string;,它是为APIGatewayProxyResult.headers 设置的。我的代码和文章中提供的代码的区别在于我使用的是异步函数,我抛出的错误与callback("Unauthorized")相同。
    • 你所做的和callback("Unauthorized")不一样。 Lambda Authorizer 将返回 401 你的 Lambda 不会。您可以尝试在响应中不添加 headers 键。
    • 我会用同步和异步代码再次测试它并在这里给出反馈,感谢您的快速回答:)
    • 不幸的是,没有标题的响应返回401 作为状态码,屏幕上显示文本Unauthorized,仅此而已(提示窗口不会出现)。此外,简单的callback("Unauthorized") 也不会在函数的同步范围内显示窗口。您确定可以在没有自定义授权人的情况下执行此操作吗?
    • 我试过了,但我得到了相同的输出。状态码 -> 401,屏幕上的文字,仅此而已。你确定这个标题没有消失在某个地方吗?
    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 2017-11-23
    • 2016-07-14
    • 2017-05-20
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多