从自定义授权程序Lambda函数

时间:2017-11-20 20:25:49

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

我在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: '*******'
  }
}

2 个答案:

答案 0 :(得分:11)

对于类似的问题,每个this answer,似乎并未向自定义授权者提供正文。文档here未列出正文参数。我想也许这个想法是授权者应该依赖路由和头文件而不是进入应用程序级的主体数据。

答案 1 :(得分:0)

如果需要实现基于签名的授权者,则可以使用Lambda @ Edge。它与Cloud Front一起使用,您可以拦截查看器请求,原始请求,原始响应和查看器响应中的事件。

收到的字段: 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