跳转到主要内容

Cromlech的JWT支持

项目描述

为Web应用程序提供JSON Web Tokens实用工具。可以生成和验证签名和加密令牌,是否存储或自弃。

先决条件

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

>>> 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 = 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
>>> token = service.generate(data)
>>> 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.2.1 (2022-10-24)

  • 文档更新

0.2 (2022-10-24)

  • 针对 jwcrypto >= 1.4 进行更新

0.1 (2018-08-27)

  • 初始发布

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

cromlech.jwt-0.2.1.tar.gz (7.9 kB 查看哈希值)

上传时间 源代码