导出目录的签名身份验证库。

sigauth的Python项目详细描述


目录签名验证

code-climate-imagecircle-ci-imagecodecov-imagepypi-image

library使用消息身份验证代码(mac)算法实现hawk身份验证方案,以提供部分http请求加密验证。


客户机实现RequestSigner以生成请求url和正文的秘密咸散列。机密盐与目标服务器共享。

目标服务器实现RequestSignatureChecker,以检查请求头中提供的签名是否准确地描述了请求的url和请求体。

如果RequestSignatureChecker接受头为正版,则接受请求,否则拒绝请求。

请求签名者用法

python请求

在客户端上,可以为requestsrequests.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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java应用程序不是在Eclipse中运行,而是在命令行中运行   swing Java图形组件问题。似乎找不到错误   我需要键盘。close();让代码正常工作?   Springboot中的java HttpSession   抽象语法树我想添加一个语句。我试图解析它,java解析器异常被抛出。如何克服它?   java Hibernate:清理会话   具有不连续子集的java划分问题   java正则表达式查找最后一个冒号后的字符串   java从SpringShell执行OS命令   Java扫描器字符串输入   java字符串索引越界异常(charAt)   java执行器服务终止被卡住   Springockito没有继承java@ContextConfiguration   java如何为一个servlet映射多个url   java安卓获取命令的stderr   java生成类型。表:数据库中的大数字   安卓 Getter Setter返回NothingJava