跳转到主要内容

这是一个将 django.contrib.sessions 与 JWT 结合的 django 应用。

项目描述

https://coveralls.io/repos/github/smartfile/django-session-jwt/badge.svg?branch=master https://github.com/smartfile/django-session-jwt/actions/workflows/ci.yml/badge.svg https://badge.fury.io/py/django-session-jwt.svg

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

项目详情


下载文件

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

源代码分发

django-session-jwt-0.10.19.tar.gz (13.9 kB 查看哈希值)

上传时间 源代码

构建分发

django_session_jwt-0.10.19-py3-none-any.whl (14.5 kB 查看哈希值)

上传于 Python 3

由以下支持