从自定义授权方 Lambda 函数访问 POST 请求正文

Posted

技术标签:

【中文标题】从自定义授权方 Lambda 函数访问 POST 请求正文【英文标题】:Access POST Request body from Custom Authorizer Lambda Function 【发布时间】:2018-05-04 04:04:48 【问题描述】:

我在 AWS 中配置了一个自定义授权器 lambda 函数,用于将 API 配置为具有 POST 资源的另一个 Lambda 函数。

授权方设置为 Request 类型,而不是 Token,因为我没有在 Authorization 标头中使用令牌,而是想要访问正在发布的表单数据。

当我检查我的授权函数的 event 参数的内容时,我看不到任何原始的 POST 请求正文(表单数据)。但是,如果我将资源更改为GET,我会按预期看到queryStringParameters 中的表单数据。

(注意下面当请求为 POST 时,queryStringParameters 始终为空对象)

当使用POST 方法时,是否可以从函数中的请求访问表单数据?

以下是使用 POST 时授权函数的 event 参数将包含的内容的示例:


  type: 'REQUEST',
  methodArn: 'arn:aws:execute-api:us-east-1:********:********/dev/POST/receive',
  resource: '/receive',
  path: '/sms/receive',
  httpMethod: 'POST',
  headers: 
    Accept: '*/*',
    'CloudFront-Viewer-Country': 'US',
    'CloudFront-Forwarded-Proto': 'https',
    'CloudFront-Is-Tablet-Viewer': 'false',
    'CloudFront-Is-Mobile-Viewer': 'false',
    'User-Agent': 'TwilioProxy/1.1',
    'X-Forwarded-Proto': 'https',
    'CloudFront-Is-SmartTV-Viewer': 'false',
    Host: 'api.myredactedcompany.io',
    'X-Forwarded-Port': '443',
    'X-Amzn-Trace-Id': 'Root=**************',
    Via: '1.1 ***************.cloudfront.net (CloudFront)',
    'Cache-Control': 'max-age=259200',
    'X-Twilio-Signature': '***************************',
    'X-Amz-Cf-Id': '****************************',
    'X-Forwarded-For': '[redacted IP addresses]',
    'Content-Length': '492',
    'CloudFront-Is-Desktop-Viewer': 'true',
    'Content-Type': 'application/x-www-form-urlencoded'
  ,
  queryStringParameters: ,
  pathParameters: ,
  stageVariables: ,
  requestContext: 
    path: '/sms/receive',
    accountId: '************',
    resourceId: '*****',
    stage: 'dev',
    requestId: '5458adda-ce2c-11e7-ba08-b7e69bc7c01c',
    identity: 
      cognitoIdentityPoolId: null,
      accountId: null,
      cognitoIdentityId: null,
      caller: null,
      apiKey: '',
      sourceIp: '[redacted IP]',
      accessKey: null,
      cognitoAuthenticationType: null,
      cognitoAuthenticationProvider: null,
      userArn: null,
      userAgent: 'TwilioProxy/1.1',
      user: null
    ,
    resourcePath: '/receive',
    httpMethod: 'POST',
    apiId: '*******'
  

【问题讨论】:

【参考方案1】:

根据this answer 的类似问题,似乎没有将正文提供给自定义授权人。文档here 没有列出正文参数。我认为可能的想法是授权者应该依赖路由和标头,而不是进入应用程序级的正文数据。

【讨论】:

这有点傻,因为亚马逊自己的身份验证机制需要完整的正文内容。如果能够实现一个基于签名的授权器以获得更好的安全性,那就太好了。【参考方案2】:

如果您需要实现基于签名的授权方,您可以使用 Lambda@Edge。它适用于云端,您可以拦截查看器请求、源请求、源响应和查看器响应中的事件。

收到的字段: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html#request-event-fields-request

注意正文大小限制,如果超出大小限制,正文将被截断。 https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-requirements-limits.html#lambda-at-the-edge-body-size-limits-lambda-at-edge

【讨论】:

以上是关于从自定义授权方 Lambda 函数访问 POST 请求正文的主要内容,如果未能解决你的问题,请参考以下文章

未调用 AWS API Gateway 自定义授权方

使用 Lambda 授权方的 AWS Cognito 和 API 网关

AWS API Gateway 自定义授权方给予例外

通过 AppSync 上的自定义 Lambda 授权方对突变进行身份验证

AWS 无服务器自定义 jwt 授权方 lambda 设置 cors 响应

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据