4

我正在尝试使用 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:示例机器人详细信息、输入和输出示例

4

2 回答 2

9

经过大量试验和错误并尝试从 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)
于 2017-05-12T07:58:52.073 回答
2

除了直接与 Microsoft Teams 交互之外,另一种选择可能是使用 Microsoft Bot Connector API。

https://docs.botframework.com/en-us/restapi/connector/

我有一个使用https://github.com/Grungnie/microsoftbotframework与 Microsoft Teams 合作的机器人,它正在验证从 Microsoft 发送的 JWT。

于 2017-05-03T14:27:09.160 回答