我正在尝试按照how to build custom bots上的说明使用Flask构建Microsoft Teams聊天机器人。但是我无法验证我真正想要的安全性的HMAC身份验证。
根据指南和文档,我发现我正在使用以下最小化测试应用程序尝试计算传入请求的HMAC。 (机器人名称和说明DevBot
以及下面的密钥/ security_token用于测试)。
#!/usr/bin/python
# coding=utf-8
from flask import Flask, request, jsonify
import hmac, hashlib, base64, json
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def webhook():
if request.method == 'POST':
# Authenticate
security_token = b"O5XHU8OSzwx8w9YiM0URkR/Ij4TZZiZUwz7Swc+1hZE="
request_data = request.get_data()
digest = hmac.new(security_token, msg=request_data, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()
# TODO: Verify signature = Authorization header HMAC here
return jsonify({
'type' : 'message',
'text' : "Auth header: {0} <br>Calculated HMAC: {1}".format(request.headers.get('Authorization'), signature),
})
elif request.method == 'GET':
return "Hello World"
if __name__ == '__main__':
app.run(debug=True)
发送消息@DevBot test
后,我在机器人的回复中收到以下哈希值,但它们并没有按预期匹配:
Auth header: HMAC LuDmz97y/Z2KWLIZ1WZASz3HlOEtDCwk5/lL/fK8GqM=
Calculated HMAC: eaxTdJSLuU3Z4l94bxFiWvsBhjNG9SPxwq/UHeR7KcA=
任何想法或指示?我一直在尝试使用编码的各种东西,但我觉得Flask可能正在做一些修改请求体的东西吗?
编辑1:小澄清
编辑2:完整的Flask应用示例
编辑3:示例机器人详细信息,输入和输出示例
答案 0 :(得分:1)
另一个选项而不是直接与Microsoft Teams接口可能是使用Microsoft Bot Connector API。
https://docs.botframework.com/en-us/restapi/connector/
我有一个使用https://github.com/Grungnie/microsoftbotframework与Microsoft团队合作的机器人,它正在验证从Microsoft发送的JWT。
答案 1 :(得分:1)
经过大量试验和错误并尝试从MS重现C#代码示例后,我自己设法解决了这个问题。这是解决方案:
#!/usr/bin/python
# coding=utf-8
from flask import Flask, request, jsonify
import hmac, hashlib, base64, json
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def webhook():
if request.method == 'POST':
# Reply
data = request.get_json()
channel = data['channelId']
message_type = data['type']
sender = data['from']['name']
message_format = data['textFormat']
message = data['text']
# Authenticate
security_token = b"O5XHU8OSzwx8w9YiM0URkR/Ij4TZZiZUwz7Swc+1hZE="
request_data = request.get_data()
digest = hmac.new(base64.b64decode(security_token), msg=request_data, digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()
# TODO: verify that HMAC header == signature
return jsonify({
'type' : 'message',
'text' : "auth header: {0} <br>hmac: {1}".format(request.headers.get('Authorization').split(' ')[1], signature),
})
elif request.method == 'GET':
return "Hello World"
if __name__ == '__main__':
app.run(debug=True)