【问题标题】:Getting authorizer context from Step Function executed from API Gateway从 API 网关执行的 Step Function 获取授权方上下文
【发布时间】:2023-01-14 01:29:43
【问题描述】:

我正在尝试让我的 API Gateway api 执行以下操作:

  1. 运行授权器
  2. 将授权上下文传递给 Step Function 执行
  3. 使用 Step Function 输出响应客户端

    我已经完成了#1 和#3,但事实证明,将附加的授权方 lambda 的响应传递给 step 函数是不可能的。

    我发现 this pagethis page 以及关于您可以将哪些插值值用于参数映射的参考表(创建集成 -> 步进函数:StartSyncExecution -> 高级设置 -> 输入)但是任何时候我尝试使用与$context$context.authorizer.email 一样,API 网关只响应 HTTP 400 并给我这个 CloudWatch 输出:

    "Unable to resolve property Input from source {\"lambdaName\": \"arn:aws:lambda:us-east-1:xxxxxxx\", \"reqBody\": $request.body.Input, \"authContext\": $context.apiId }. Please make sure that the request to API Gateway contains all the necessary fields specified in request parameters."
    

    这些是我尝试用于输入文本框的 JSON 对象,所有这些对象要么在尝试保存时给我一个错误,要么在我访问路由时抛出 HTTP 400 并记录上述错误:

    • {"lambdaName": "xxx", "reqBody": $request.body.Input, "authContext": $context.authorizer.email }
    • {"lambdaName": "xxx", "reqBody": $request.body.Input, "authContext": "$context.authorizer.email" }
    • {"lambdaName": "xxx", "reqBody": $request.body.Input, "authContext": $context.apiId }
    • {"lambdaName": "xxx", "reqBody": $request.body.Input, "authContext": $context }
    • {"lambdaName": "xxx", "reqBody": $request.body.Input, "authContext": $event.requestContext.authorizer.email }

    似乎让授权代码使用步骤函数的唯一方法是将我的 API 网关调用的步骤函数包装在其他授权请求然后调用端点步骤函数的步骤函数。我已经研究了几个小时,但我一无所获。任何帮助都表示赞赏。

【问题讨论】:

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


    【解决方案1】:

    我最终通过使用 API Gateway v1 和 REST API 而不是 HTTP API 解决了这个问题。由于某些原因,v2 的输入字段目前对 $request.body.Input 以外的任何东西都不起作用。从那里,我将所有端点连接到一个步骤函数,该函数在请求中的 Authorization 标头上运行授权 lambda。

    我有一个步骤函数,它允许我将步骤函数和 lambda 操作链接在一起,因此对于大多数请求,我只需将授权方 lambda 和端点的操作(可以是 lambda 或另一个步骤函数)链接在一起。

    这里的主要要点是,如果您使用的是 API 网关和 Step Functions,如果不在 REST API 中使用 API Gateway v1,看起来将自定义格式的输入传递到您的 step 函数并不是一件容易的事,而不是HTTP 接口。希望这将在未来得到解决。

    【讨论】:

      【解决方案2】:

      另一种解决方案可能是使用映射模板在 API 网关集成请求中。

      示例:考虑 Lambda 授权方的响应如下:

      {
                  principalId: 'myuser',
                  context: {
                      customKey: 'CustomValue'
                  },
                  policyDocument: {
                      Version: '2012-10-17',
                      Statement: [
                          {
                              Action: ['execute-api:Invoke'],
                              Effect: 'Allow',
                              Resource:
                                  'arn:aws:execute-api:_region_:111111111111:0a0a0a0a0a/default/POST/my-endpoint'
                          }
                      ]
                  }
              }
      

      在映射模板中应用程序/json, 映射你想要的任何属性输入字段(引用转义)。从 Lambda 授权方发送的每个属性语境字段将作为 $context.authorizer 提供。财产.

      一种可能的模板映射可能是:

      {
        "input": "{"origin":"$input.json('$.requestvalue').replaceAll('"','')", "customPropertyFromLambdaAuthorizer" : "$context.authorizer.customKey" }", 
        "name": "DemoStateMachineRequest",
        "stateMachineArn": "arn:aws:states:_region_:11111111111:stateMachine:MyStateMachine"
      }
      
      

      参考$context.authorizer.property

      【讨论】:

        猜你喜欢
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        • 2017-10-17
        • 2020-06-22
        • 2022-07-23
        • 2020-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多