导出目录的签名身份验证库。
sigauth的Python项目详细描述
目录签名验证
library使用消息身份验证代码(mac)算法实现hawk身份验证方案,以提供部分http请求加密验证。
客户机实现RequestSigner
以生成请求url和正文的秘密咸散列。机密盐与目标服务器共享。
目标服务器实现RequestSignatureChecker
,以检查请求头中提供的签名是否准确地描述了请求的url和请求体。
如果RequestSignatureChecker
接受头为正版,则接受请求,否则拒绝请求。
请求签名者用法
python请求
在客户端上,可以为requests的requests.Request
生成签名:
import requests
from sigauth.utils import RequestSigner
from django.conf import settings
request_signer = RequestSigner(settings.API_SIGNATURE_SECRET)
def send_request(method, url, body):
request = requests.Request(method=method, url=url, body=body).prepare()
sign_request(request)
return requests.Session().send(request)
def sign_request(request):
headers = request_signer.get_signature_headers(
url=request.path_url,
body=request.body,
method=request.method,
content_type=request.headers.get('Content-Type'),
)
request.headers.update(headers)
requestSignatureChecker用法
django rest框架
这个库实现了django rest框架的RequestSignatureChecker
的包装器:SignatureCheckPermissionBase
。必须对其进行子分类才能设置机密:
from sigauth import permissions
from django.conf import settings
class SignatureCheckPermission(permissions.SignatureCheckPermissionBase):
secret = settings.SIGNATURE_SECRET
在目标服务器上,SignatureCheckPermission
可以在DEFAULT_PERMISSION_CLASSES
设置中设置,或者在特定drf视图的permission_classes
属性上设置。
django视图
在目标服务器上,签名检查器也可以在视图上实现:
from django.http import HttpResponseForbidden
from sigauth.utils import RequestSignatureChecker
api_checker = RequestSignatureChecker(settings.SIGNATURE_SECRET)
class SignatureCheckMixin:
def dispatch(self, request, *args, **kwargs):
if api_checker.test_signature(request) is False:
return HttpResponseForbidden()
return super().dispatch(request, path='', *args, **kwargs)
SignatureCheckMixin
然后可用于视图以拒绝已被篡改的传入请求。
注意,在上面的示例中,客户端的settings.API_SIGNATURE_SECRET
必须与api的settings.SIGNATURE_SECRET
值相同
中间件
有些服务可能希望每个请求都需要签名检查。这个库为django中间件实现了一个RequestSignatureChecker
的包装器,以方便实现这一点:SignatureCheckMiddlewareBase
。必须对其进行子分类才能设置机密:
from sigauth.middleware import SignatureCheckMiddlewareBase
from django.conf import settings
class SignatureCheckMiddleware(SignatureCheckMiddlewareBase):
secret = settings.SIGNATURE_SECRET
SignatureCheckMiddleware
然后可以添加到MIDDLEWARE
设置中(如果使用django<;2,则可以添加到MIDDLEWARE_CLASSES
)。将SIGAUTH_URL_NAMES_WHITELIST
设置设置为应从检查中排除的url名称列表。
安装
pip install -e git+https://git@github.com/uktrade/directory-signature-auth.git@v1.0.0#egg=directory-signature-auth
开发
$ git clone https://github.com/uktrade/directory-signature-auth
$ cd directory-signature-auth
$ make
发布到pypi
包应该在合并到主服务器时发布到pypi。如果您需要在本地执行此操作,请从rattic获取凭据并将环境变量添加到主机:
Setting |
---|
DIRECTORY_PYPI_USERNAME |
DIRECTORY_PYPI_PASSWORD |
然后运行以下命令:
make publish