[英]Unable to verify messages from slack through AWS API Gateway to Lambda
我正在嘗試通過我的 AWS API 網關驗證來自 slack 的消息,我傳遞給我的 Lambda 函數的示例是
{'method': 'POST', 'body': {'token': 'xxxxxx', 'team_id': 'xxxxxx', 'api_app_id': 'xxxxxx', 'event': {'client_msg_id': 'xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx', 'type': 'message', 'text': 'test', 'user': 'xxxxxx', 'ts': 'xxxxxx.xxxx', 'team': 'xxxxxx', 'blocks': [{'type': 'rich_text', 'block_id': 'xxx', 'elements': [{'type': 'rich_text_section', 'elements': [{'type': 'text', 'text': 'test'}]}]}], 'channel': 'xxxxxx', 'event_ts': 'xxxxxx.xxxx', 'channel_type': 'im'}, 'type': 'event_callback', 'event_id': 'xxxxxxxxx', 'event_time': 1576188370, 'authed_users': ['xxxxxxx']}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip,deflate', 'Content-Type': 'application/json', 'Host': 'xxxxxxxxxx.execute-api.us-east-1.amazonaws.com', 'User-Agent': 'Slackbot 1.0 (+https://api.slack.com/robots)', 'X-Amzn-Trace-Id': 'Root=1-xxxxxx-xxxxxxxxx', 'X-Forwarded-For': '54.xxx.xxx.xxx', 'X-Forwarded-Port': '443', 'X-Forwarded-Proto': 'https', 'X-Slack-Request-Timestamp': '1576188371', 'X-Slack-Signature': 'v0=xxxxxxxxxxxxxxxxxxxxxxxx'}}
僅 body/request_body 的摘錄
{'token': 'xxxxxx', 'team_id': 'xxxxxx', 'api_app_id': 'xxxxxx', 'event': {'client_msg_id': 'xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx', 'type': 'message', 'text': 'test', 'user': 'xxxxxx', 'ts': 'xxxxxx.xxxx', 'team': 'xxxxxx', 'blocks': [{'type': 'rich_text', 'block_id': 'xxx', 'elements': [{'type': 'rich_text_section', 'elements': [{'type': 'text', 'text': 'test'}]}]}], 'channel': 'xxxxxx', 'event_ts': 'xxxxxx.xxxx', 'channel_type': 'im'}, 'type': 'event_callback', 'event_id': 'xxxxxxxxx', 'event_time': 1576188370, 'authed_users': ['xxxxxxx']}
我拉出 X-Slack-Signature、X-Slack-Request-Timestamp 和對象的主體,然后將其傳遞給以下函數
def verify_slack_request(slack_signature=None, slack_request_timestamp=None, request_body=None):
slack_signing_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'
print(request_body)
data_body = json.dumps(request_body)
basestring = 'v0:' + slack_request_timestamp + ':' + json.dumps(request_body, indent=None)
slack_signing_secret = bytes(slack_signing_secret, 'utf-8')
unicode_basestring = bytes(basestring, 'utf-8')
my_signature = 'v0=' + hmac.new(slack_signing_secret, unicode_basestring, hashlib.sha256).hexdigest()
print(my_signature)
print(slack_signature)
我遇到的問題是隨方法傳遞的松弛簽名和我的簽名不對齊,我已經能夠驗證松弛斜杠命令,但使用此方法似乎無法使用一般聊天命令。
問題是json.dumps
不會刪除鍵和值之間的空格。 該函數需要一個separators
參數來刪除空格
試試下面的代碼,你應該將 lambda 事件的主體作為字典(不是字符串)傳遞給這個函數。
import json
import hashlib
import hmac
def create_signature(secret, timestamp, data):
newdata =json.dumps(data, separators=(',', ':'))
req = ('v0:' + str(timestamp) + ':' + newdata).encode()
print('sigBaseString: ', req)
request_signature= 'v0='+hmac.new(
str.encode(secret),
req, hashlib.sha256
).hexdigest()
return request_signature
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.