解析请求体禁止请求签名验证

Posted

技术标签:

【中文标题】解析请求体禁止请求签名验证【英文标题】:Parsing request body prohibits request signature verification 【发布时间】:2020-03-11 18:31:40 【问题描述】:

我正在尝试使用 Lambda 函数构建无服务器 Slackbot。在通过 Slack 事件 API 验证请求 URL 时出现错误。 @slack/events-api 是我用来捕获松弛事件的依赖项。

这是我的代码。

const sls = require('serverless-http');
const  createEventAdapter  = require('@slack/events-api');
require('dotenv').config();

const  SLACK_SIGNING_SECRET  = process.env
const slackEvents = createEventAdapter( SLACK_SIGNING_SECRET || '' );


slackEvents.on('message', async event => 
  console.log('received!')
);


module.exports.server = sls(slackEvents.requestListener());

这是我在验证请求 url 时遇到的错误

Slack 请求 URL 验证

有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

刚刚遇到了这个确切的问题,并在node-slack-events 中查看了http-handler.js。

我们所要做的就是在serverless-http 解析它之前将原始请求正文存储为rawBody

serverless-http 允许您在将其发送到应用程序之前 transform the request — 修复的好机会:

module.exports.handler = serverless(app, 
  request(request) 
    request.rawBody = request.body;
  ,
);

【讨论】:

【参考方案2】:

我不确定如何准确解决您的问题,但我知道是什么原因造成的。

您正在使用的库 serverless-http 解析 Slack 发送的 JSON 正文。这会导致抛出错误,因为 slack-api-sdk 期望解析原始请求正文本身。

您能否尝试删除 serverless-http 并仅响应 API Gateway 事件?

【讨论】:

我已将其删除。使用不同的堆栈跟踪仍然会出现相同的错误。 太好了!你能分享堆栈跟踪和你的新处理程序逻辑吗? 嗨亚伦,这是我的新 logic 和 stack_trace。请你看一下。 这是CloudWatch_log。

以上是关于解析请求体禁止请求签名验证的主要内容,如果未能解决你的问题,请参考以下文章

body-parser Node.js(Express) HTTP请求体解析中间件

springboot请求体中的流只能读取一次的问题

Express定制参数解析错误响应值

body-parser 是一个Http请求体解析中间件

postman模拟post请求的几种请求体

签名验证反爬,反反爬第二篇博客,Python爬虫120例