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