mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-11-25 01:25:04 +08:00
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
|
import base64
|
|||
|
import hashlib
|
|||
|
import hmac
|
|||
|
from typing import TYPE_CHECKING
|
|||
|
|
|||
|
from nonebot.utils import logger_wrapper
|
|||
|
|
|||
|
if TYPE_CHECKING:
|
|||
|
from nonebot.drivers import BaseDriver
|
|||
|
log = logger_wrapper("DING")
|
|||
|
|
|||
|
|
|||
|
def check_legal(timestamp, remote_sign, driver: "BaseDriver"):
|
|||
|
"""
|
|||
|
1. timestamp 与系统当前时间戳如果相差1小时以上,则认为是非法的请求。
|
|||
|
|
|||
|
2. sign 与开发者自己计算的结果不一致,则认为是非法的请求。
|
|||
|
|
|||
|
必须当timestamp和sign同时验证通过,才能认为是来自钉钉的合法请求。
|
|||
|
"""
|
|||
|
# 目前先设置成 secret
|
|||
|
# TODO 后面可能可以从 secret[adapter_name] 获取
|
|||
|
app_secret = driver.config.secret # 机器人的 appSecret
|
|||
|
if not app_secret:
|
|||
|
# TODO warning
|
|||
|
log("WARNING", "No ding secrets set, won't check sign")
|
|||
|
return True
|
|||
|
app_secret_enc = app_secret.encode('utf-8')
|
|||
|
string_to_sign = '{}\n{}'.format(timestamp, app_secret)
|
|||
|
string_to_sign_enc = string_to_sign.encode('utf-8')
|
|||
|
hmac_code = hmac.new(app_secret_enc,
|
|||
|
string_to_sign_enc,
|
|||
|
digestmod=hashlib.sha256).digest()
|
|||
|
sign = base64.b64encode(hmac_code).decode('utf-8')
|
|||
|
return remote_sign == sign
|