【问题标题】:AWS lambda : Passing data from custom authorizer to business lambdaAWS lambda:将数据从自定义授权方传递到业务 lambda
【发布时间】:2017-02-16 14:57:47
【问题描述】:

我正在使用自定义身份验证(使用自定义授权方)来访问 AWS lambda。授权过程工作正常。但是我在授权者 lambda 和业务 lambda 之间传输数据(前 principalId)时遇到问题。我所有的 lambdas 都是用 JS 开发的。 正如 AWS 文档中解释的那样,在授权者 lambda 中,我在 Auth 响应的上下文字段中添加了几个简单的字段(下面代码中的principalId)。但是在我的业务 lambda 中,我无法获得这些字段。 AWS 文档讨论了 $context 变量。

首先,您能否解释一下,如果 $context 变量与 JS 函数的参数中接收的 context 变量是另一个变量还是同一个变量?

第二,您能否解释一下如何在我的业务 lambda 中获取授权方提供的数据字段(例如:principalId)?

Seb

【问题讨论】:

  • 为了澄清答案,在JS函数的上下文变量中是没有的。它在事件中。该事件只是一个与您的映射模板匹配的 JSON 映射,或者是“代理”集成的默认格式。

标签: amazon-web-services aws-lambda aws-api-gateway


【解决方案1】:

授权人的政策文档可以通过上下文丰富,您可以在其中放置自定义数据。该数据将通过事件提供给业务 lambda。

这是一个政策文件的例子:

const policy = {
    context: {
        customKey: 'payload data',
      },
    policyDocument: {
        Statement: [{
            Action: 'execute-api:Invoke',
            Effect: effect,
            Resource: resource,
        }],
        Version: '2012-10-17',
    },
    principalId: sub,
};

上下文包含一个“customKey”,其负载数据为字符串。

您的 API 的映射模板应如下所示:

{
  "customKey": "$context.authorizer.customKey"
}

最后,在您的业务 lambda 中,您可以通过事件访问 customKey 的值:

exports.handler = async (event, context) => {

console.log(event.customKey);

.
.
.
};

根据我的示例,这应该记录“有效负载数据”。

请注意,您不能根据documentation 将 JSON 对象或数组设置为上下文映射中任何键的有效值

【讨论】:

  • 是否可以使用 lambda 代理集成来实现这一点,还是我必须手动映射请求的其余部分才能从授权方获取此数据?
【解决方案2】:

我猜您所指的 $context 变量是 API Gateway 映射模板中可用的变量。不等同于业务Lambda的context参数。

但是,使用映射模板及其$context 变量,您可以构建业务Lambda 的event 参数。

如果您的 API 端点的映射模板如下所示:

{
  "principalId" : "$context.authorizer.principalId"
}

您应该在 Lambda 的 event 参数中检索 principalId

使用 passthrough 选项,principalId 应该在 event.context['authorizer-principal-id'] 中可用。这是创建端点时的默认行为。


文档中关于映射模板的参考:

【讨论】:

  • 您如何以及在何处定义映射模板?
  • 转到端点定义并输入 Integration Request 部分。然后在 Body Mapping Templates 中,有多种选项可以根据请求内容类型定义通用集成或特定集成。
【解决方案3】:

除了 Alexis 的回答之外,principalId - 目前是唯一可以从自定义授权方传递给 Lambda 的参数(截至今天)。但是,传递自定义参数的解决方法是将 JSON 参数字符串化为 principalId。关于这件事的讨论是here

【讨论】:

    【解决方案4】:

    AWS APIGateway 在 API 定义中有以下标签。

    1. End point name, method type
    2. parameters
    3. responses
    4. x-amazon-apigateway-integration => under this "requestParameters" will be populatested with mapping data or any data with key value pair.
    

    link 一定能帮到你。

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 2019-09-29
      • 1970-01-01
      • 2017-05-20
      • 2017-11-12
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多