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第三方库


热门话题
NetBeans中的Java Swing滚动窗格   java如何与具有复合键的表建立关系?   Android中读取文件时java数据丢失   java黄瓜场景。embed在ubuntu机器上不工作?   java从spring mvc控制器操作中,我如何获得请求/响应的访问权限?   java减去两个长值   java选择下一个值firebase 安卓   用于起始和结尾连字符的java正则表达式   Java正则表达式解释   java Lifefay freemarker ADT:方法不可用?   java我怎样才能让我的开关盒作用于JFrame?   java在我的场景中使用连接池的理想方式是什么   java我如何接受jsoup的cookies?   java如何将整数数组更改为字符串数组?   java Android操作\u指针\u向上直到剩余触摸移动时才调用   java为什么gradle会出错?   io如何在java中复制/拆分输入流?   java使JButton不可见,但尊重其原始空间   java Spring提交表单获取复选框值不起作用