Telegram Web 登录上的 HMAC-SHA-256 签名验证失败

HMAC-SHA-256 signature verification failure on Telegram Web Login

我正在尝试将 Telegram Web 登录添加到我的 Django+Vue 项目中。我在 Vue 上处理登录,并通过 DRF 直接将从 TG 获取的授权数据传递给 Django。那工作正常。问题出现在对 REST 的 POST 视图的验证中。当我在 Vue 上使用 js-sha256 库时,它工作得很好,我从 js-sha256 库中获取 sha256.hmac() 函数提供的哈希字符串的真实值。我正在努力在 Python 上获得相同的哈希值。 Here is the TG data verification explained 以及我在 POST 视图中使用的代码:

class TelegramLoginSerializer(serializers.Serializer):
    raw_data = serializers.JSONField(required=True)

def create(self, validated_data):
    raw_data = validated_data['raw_data']
    tg_data = "\n".join([f'{k}={raw_data[k]}' for k in sorted(raw_data)])

    if raw_data['hash'] != self.verify_telegram_data(tg_data):
        return PermissionDenied()
    else:
        ...

@staticmethod
def verify_telegram_data(data):
    secret_key = hashlib.sha256(settings.TG_BOT_TOKEN.encode('utf-8'))
    message = data.encode('utf-8')
    return hmac.new(secret_key.digest(), message, hashlib.sha256).hexdigest()

解决方法如下:

message = data.encode('utf-8').decode('unicode-escape').encode('ISO-8859-1')

已编辑: 我简化了解决方案,也忘了提到当您使用“\n”连接连接查询字符串时,问题与字节的编码和解码有关。您需要使用转义解码并再次编码。

希望对您有所帮助。