这是一个将 django.contrib.sessions 与 JWT 结合的 django 应用。
项目描述
django-session-jwt
这是一个扩展 django.contrib.sessions 系统的会话中间件。它与 Django 会话兼容,因为它使用存储在 cookie 中的会话键。不同之处在于 cookie 的格式。
django.contrib.sessions 存储一个名为 settings.SESSION_COOKIE_NAME 的 cookie,其中包含类似于 "5a6aybftilfw60wl9ehwrg4ybzawr9b4" 的值。会话键是服务器端用于检索与会话相关联的额外数据使用的密钥。这些数据存储在后端,如数据库或 memcache。
django_session_jwt.sessions 通过修改会话 cookie 的格式来增强此行为。它不是将会话键作为 cookie 的值写入,而是写入包含会话键的 JWT。除了会话键之外,JWT 还可以包含其他所需的字段。
进行此扩展的原因是,允许在不修改的情况下利用 django 服务器端会话,同时为其他联邦服务提供 JWT。虽然可以通过使用多个 cookie 来实现这一点,但 JWT 既是客户端存储,也包含服务器端存储的密钥。
安装
此模块尊重 django.contrib.sessions 的设置,并提供额外的选项来控制 JWT。
pip install django-session-jwt
然后修改 settings.py
# Replace Django's SessionMiddleware
MIDDLEWARE = [
...
# "django.contrib.sessions.middleware.SessionMiddleware",
"django_session_jwt.middleware.SessionMiddleware",
...
]
SESSION_COOKIE_NAME='sessionid'
DJANGO_SESSION_JWT = {
# Fields allow you to specify which attributes of the user object will be stored
# in the JWT (and copied to the session).
'FIELDS': [
# You can provide all three options:
('attribute_name', 'short form', 'long form'),
# Short and long forms can be the same by omitting one.
('attribute_name', 'both forms'),
# The attribute_name can reference nested attributes by using period(s). also
# the field can be a string, in which case the attribute name is used as both
# the long and short forms.
'related_object.attribute_name',
...
],
# You can also populate the JWT fields by configuring your own callable. The
# callable should return a dictionary. The function should optionally accept user.
'CALLABLE': 'some.module.with.a.function',
# KEY can also be a tuple in order to specify private and public keys.
'KEY': 'string value or path to PEM key file',
# 'KEY': (private_key_or_path, public_key_or_path),
# The session field is used to store the session key within the JWT. The default
# is 'sk' but it can be overridden.
'SESSION_FIELD': 'sk',
...
}
作为一个优化,FIELDS 列表可以包含元组 ('attribute_name', 'short form', 'long form'),为字段提供一个简短名称。JWT 密钥将使用简短名称,但在解码时将转换为长名称。这有助于减小 JWT 的大小。
使用 JWT
默认情况下,JWT 将包含单个值 "sk",并且比默认会话 cookie 稍大。这个应用的全部目的就是允许你向 JWT 添加其他字段,这些字段可以被运行在你的 Django 应用旁边的其他服务使用。
安装并配置后,浏览器将随每个请求发送会话 cookie。这个 cookie 将被验证,sk/会话密钥将用于在 Django 应用中设置 Django 会话。外部应用可以直接利用 JWT,因此你应该在 DJANGO_SESSION_JWT['FIELDS'] 列表/元组中定义任何“全局”字段。这样,存储在 Django 会话中的旧数据就不会污染 JWT,反之亦然。
你可以使用对称密钥或非对称密钥对。在 simplest case 中,你可以设置 DJANGO_SESSION_JWT['KEY'] = SECRET_KEY。然后你需要将 SECRET_KEY 分发给所有联邦服务。另一个选项是使用非对称密钥对,例如 RSA 密钥对。这样,Django 应用仅保留用于签署 JWT 的私钥,而联邦服务仅保留用于验证签名的公钥。混合配置可能将私钥与多个联邦服务共享,以用于发行或扩展 JWT,同时限制其他服务仅使用公钥。
未提供用于消费 JWT 的库,联邦服务应使用可用的 JWT 库来验证并提取 JWT 字段。
Django 测试
当在单元测试中使用 Django 的 test client 时,login() 方法绕过中间件并直接设置会话 cookie。如果你使用 django-session-jwt,这可能会导致测试失败。在这种情况下,你可以使用替代的测试客户端 django_session_jwt.test.Client,该客户端覆盖了 login() 方法,将 sessoin cookie 转换为 JWT。
下面是一个 使用此测试客户端的示例。
开发
要部署到 PyPI
git tag <version> git push --tags
Travis CI 将完成剩余的工作。
测试和代码风格检查
make test make lint
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定要选择哪个,请了解更多关于 安装软件包 的信息。
源代码分发
构建分发
哈希值 for django_session_jwt-0.10.19-py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5cd654ccb7cb3ba7e78f17ae191ddd58316d8a96ea45519981978efad4cb12c8 |
|
MD5 | 92f1045869667418a984b195205853c0 |
|
BLAKE2b-256 | ee1b5085f10525ff35a678245aaaa3e49613088d5d5457f6f6e3fb1204879539 |