json - AWS Lambda 验证来自 Slack 的请求
问题描述
我在 AWS Lambda 中有以下 Python 代码来验证收到的事件是否确实来自 Slack:
import hmac
import json
def verifySignature(header,body):
h = hmac.new(key=os.getenv('sign_secret').encode(), \
msg=f'v0:{header.get("X-Slack-Request-Timestamp")}:{body}'.encode(), \
digestmod="sha256")
result = hmac.compare_digest('v0='+h.hexdigest(),header.get('X-Slack-Signature'))
print('v0='+h.hexdigest(),header.get('X-Slack-Signature'))
return result
def lambda_handler(event, context):
body = json.loads(event.get('body'))
if verifySignature(event.get('headers'),body):
do_something()
此处概述了 Slack 的身份验证协议。但是,我不断收到不匹配的签名(结果 == False)。有谁知道为什么?
解决方案
问题很可能来自编码/解码。有pip 包来验证松弛签名。
但是验证码很简单:
import hashlib
import hmac
def verify_slack_signature(slack_post_request, slack_signing_secret):
slack_signing_secret = bytes(slack_signing_secret, 'utf-8')
slack_signature = slack_post_request['headers']['X-Slack-Signature']
slack_request_timestamp = slack_post_request['headers']['X-Slack-Request-Timestamp']
request_body = slack_post_request["body"]
basestring = f"v0:{slack_request_timestamp}:{request_body}".encode('utf-8')
my_signature = 'v0=' + hmac.new(slack_signing_secret, basestring, hashlib.sha256).hexdigest()
return hmac.compare_digest(my_signature, slack_signature)
推荐阅读
- algorithm - Branch & Bound 问题中矩阵约简的意义何在?
- php - 使用复选框删除多行
- android - 房间中的惰性和更新项目无法按预期工作
- android-studio - Android Studio Emulator (Flutter) - 每次键入时都会弹出虚拟键盘,包括没有文本字段的屏幕
- firebase - 如何从服务器上的 Firebase 功能访问 Google Cloud Storage
- docker - 如何在 docker-compose.yml 文件中设置持久数据
- android - 如何更改 TextView 的 drawableEnd 属性
- android - 不让我构建我的 android 项目,但让我在 Unity 2019.1.6f1 Personal 中调试它
- python - 是否有图书馆或建议的策略来安排工作时间和休息时间?
- javascript - 为什么 axios.get 没有返回承诺