用于http请求签名的hmac签名库
signit的Python项目详细描述
关于
signit是用于创建和验证hmac(hmac-sha256 by 默认值)可用于对API请求进行签名的签名。
用例
在client端,您可以
- 使用signit.signature.create() 签署请求
在server端,您可以
- 使用 signit.signature.parse()
- 使用signit.signature.verify() 验证检索到的签名
- 为客户端生成访问密钥和密钥 signit.key.generate()
使用示例(客户端)
importdatetimeimportrequestsimportsignitACCESS_KEY='MY_ACCESS_KEY'SECRET_KEY='MY_SECRET_KEY'defcreate_user(user:dict)->bool:msg=str(datetime.datetime.utcnow().timestamp())auth=signit.signature.create(MY_ACCESS_KEY,MY_SECRET_KEY,msg)headers={'Unix-Timestamp':msg,'Authorization':auth,}r=requests.post('http://example.com/users',json=user,headers=headers)returnr.status_code==201
授权标题将类似于
Authorization: HMAC-SHA256 MY_ACCESS_KEY:0947c88ce16d078dde4a2aded1fe4627643a378757dccc3428c19569fea99542
使用示例(服务器)
服务器已为您颁发了访问密钥和密钥。只有 你和服务器知道密钥。
以便服务器可以通过您的公共访问密钥和 确保使用密钥在中生成消息的哈希 这边:
# ...somewhere in my_api/resources/user.pyimportsignitfromaiohttpimportwebfrompsycopg2importIntegrityErrorasyncdefpost(request):message=request.headers['Unix-Timestamp']signature=request.headers['Authorization']prefix,access_key,hmac_digest=signit.signature.parse(signature)secret_key=awaitget_secret_key_from_db(access_key)ifnotsignit.signature.verify(hmac_digest,secret_key,message):raiseweb.HTTPUnauthorized('Invalid signature')try:awaitcreate_user(request)exceptIntegrityError:raiseweb.HTTPConflict()returnweb.HTTPCreated()
另外,如果使用Unix-Timestamp作为消息消息,则 服务器可以检查请求是否太旧,并使用401拒绝 防止“重放攻击”。