JWT对Cromlech的支持

cromlech.jwt的Python项目详细描述


用于Web应用程序的JSON WebTokens实用程序。 可以生成和验证签名和加密的令牌,有无 储存或自嘲。

先决条件

为了使用加密功能,我们创建了一个加密密钥。 需要存储此密钥才能在应用程序中重用。确保它是 存储在一个安全的地方作为令牌依赖于这个被认为是“安全的”。

>>> from cromlech.jwt.components import JWTHandler
>>> key = JWTHandler.generate_key()

请在此处阅读更多信息:http://jwcrypto.readthedocs.io。 可用的密钥生成选项:密钥类型、大小。

您可以从键值和类型加载键:

>>> key_string = JWTHandler.dump_key(key)
>>> key = JWTHandler.load_key(key_string)

处理程序

handler类是第一层实用程序的载体。 可以将处理程序实例配置为生成自毁令牌。

默认情况下,令牌没有过期时间。没有到期日期的令牌可以是 存储和管理在您自己的应用程序层中,实现您自己的 超时机制和策略。

>>> handler = JWTHandler()
>>> data = {"user": "Cromlech User"}
>>> payload = handler.create_payload(**data)
>>> sorted(payload.items())  # doctest: +ALLOW_UNICODE
[('uid', '...'), ('user', 'Cromlech User')]

配置超时将触发过期时间的创建。 超时是一个整数,表示以分钟为单位的寿命。

>>> handler = JWTHandler(auto_timeout=60)
>>> payload = handler.create_payload(**data)
>>> sorted(payload.items())  # doctest: +ALLOW_UNICODE
[('exp', ...), ('uid', '...'), ('user', 'Cromlech User')]

注意,默认情况下会创建uid属性。基本策略是创建 基于uuid的uid(这里是uuid4)。您可以在 子类。

服务

服务类为处理程序提供了一个包装器,以简化 操作。它允许您配置处理程序、生成和验证。 此外,如果您愿意的话,它还有一个骨架结构来存储和刷新 创建自己的令牌策略。

>>> from cromlech.jwt.components import JWTService
>>> service = JWTService(key, JWTHandler)
>>> service.handler.auto_timeout
60
>>> import six
>>> token = service.generate(data)
>>> assert isinstance(token, six.string_types)
>>> import json
>>> token_data = handler.decrypt_and_verify(key, token)
>>> sorted(json.loads(token_data).items())  # doctest: +ALLOW_UNICODE
[('exp', ...), ('uid', '...'), ('user', 'Cromlech User')]
>>> auth_data = service.check_token(token)
>>> sorted(auth_data.items())  # doctest: +ALLOW_UNICODE
[('exp', ...), ('uid', '...'), ('user', 'Cromlech User')]
>>> import pytest
>>> from cromlech.jwt.components import InvalidToken
>>> with pytest.raises(InvalidToken) as invalid:
...     service.check_token(token + 'some_altering_data')

我们可以重写有效载荷自动生成的数据,以获得灵活性:

>>> data = {"user": "Cromlech User", "uid": "My Own ID"}
>>> token = service.generate(data)
>>> token_data = handler.decrypt_and_verify(key, token)
>>> sorted(json.loads(token_data).items())  # doctest: +ALLOW_UNICODE
[('exp', ...), ('uid', 'My Own ID'), ('user', 'Cromlech User')]

这样,我们就创建了一个有意弃用的令牌来测试:

>>> from cromlech.jwt.utils import get_posix_timestamp, expiration_date
>>> deprecated = get_posix_timestamp(expiration_date(-60))
>>> data = {"user": "Cromlech User", "exp": deprecated}
>>> token = service.generate(data)
>>> from cromlech.jwt.components import ExpiredToken
>>> with pytest.raises(ExpiredToken):
...     token_data = handler.decrypt_and_verify(key, token)

注意,如果您的处理程序未配置为自嘲,则添加 有效负载的到期日期将生成错误:

>>> service = JWTService(key, JWTHandler, auto_deprecate=False)
>>> deprecated = get_posix_timestamp(expiration_date(60))
>>> data = {"user": "Cromlech User", "exp": deprecated}
>>> from cromlech.jwt.components import InvalidPayload
>>> with pytest.raises(InvalidPayload) as payload_error:
...     token = service.generate(data)
>>> payload_error.value
InvalidPayload('Expiration is not allowed.',)

更改

0.1(2018-08-27)

  • Initial release

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

推荐PyPI第三方库


热门话题
java如何克服带有空值的不可空bean级验证   “此行有多个标记”的authenticateUser上的java MySQLConnection错误   java处理Jackson异常   java Netbeans编辑器如何知道文件在撤消后不会被修改?   目标C相当于Java的ArrayList   java当需要int时,可以将short传递给方法调用吗?   drawString()方法上的java MouseListener   java服务器socket是执行此操作的最佳选项   java需要单个匹配bean,但找到了2:org。springframework。网状物servlet。mvc。方法注释。RequestMappingHandlerMapping   如何在Java中执行Windows命令?   安卓应用程序的java文件主机   java将所有spring引导属性都设置在内。将yml文件转换为系统属性   Java邮件中的html内联链接在邮件客户端中不起作用   Java二进制文件的bazel版本控制   java如何在自定义ListView中使用Intent   java(Spring MVC+Hibernate 4+Test 4)自动连线DAO返回NULL   java一次add()调用可以在Solr服务器中索引多少文档?   java如何获取Avro GenericRecord大小