📜  Django UTC-1 中的 JET 令牌身份验证 (1)

📅  最后修改于: 2023-12-03 15:00:26.791000             🧑  作者: Mango

Django UTC-1 中的 JET 令牌身份验证

在Django UTC-1项目中, JET是一款非常强大的后台管理工具,可以帮助开发者快速创建管理后台,同时还提供了令牌身份验证功能,可以实现用户身份的验证,保障数据的安全。

令牌身份验证的作用

令牌身份验证是基于Token的一种身份认证机制,了解令牌身份验证的作用可以更好地理解JET的使用。

在传统的基于session的认证机制中,服务端需要维护session状态,每个请求都需要从数据库中查询session来确保用户的合法性,这种认证方式会造成过多的数据库查询和服务器压力。

而基于Token的身份认证机制不需要维护session状态,每个请求只需要在请求头中携带Token,服务器通过Token验证用户的身份,而Token的验证是基于密钥签名的,从而可以避免直接查询数据库从而提高了服务端的性能和安全性。

JET 令牌身份验证的实现

JET提供了令牌身份验证的功能,下面介绍如何在Django UTC-1项目中使用JET的令牌身份验证。

安装JET

首先安装JET,使用pip命令安装即可。

pip install django-jet
添加JET设置

settings.py中添加JET的设置。

INSTALLED_APPS = [
    # ...
    'jet',
    'jet.dashboard',
]

JET_DEFAULT_THEME = 'default'

JET_INDEX_DASHBOARD = 'app.dashboard.CustomIndexDashboard'

JET_APP_INDEX_DASHBOARD = 'jet.dashboard.dashboard.DefaultAppIndexDashboard'

JET_SIDE_MENU_CUSTOM_APPS = [
    ('app', [
        {'label': 'Model1', 'url': '/admin/app/model1/'},
        {'label': 'Model2', 'url': '/admin/app/model2/'},
    ]),
]

JET_SIDE_MENU_COMPACT = True

其中,INSTALLED_APPS中添加了jetjet.dashboardJET_DEFAULT_THEME设置了默认的主题样式,JET_INDEX_DASHBOARDJET_APP_INDEX_DASHBOARD设置了仪表板的默认路径,JET_SIDE_MENU_CUSTOM_APPS设置了侧边菜单的内容,JET_SIDE_MENU_COMPACT设置了侧边菜单的紧凑样式。

添加JET令牌身份验证设置

settings.py中添加JET令牌身份验证的设置。

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'corsheaders',
    'rest_framework.authtoken',
    'jet',
    'jet.dashboard',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

CORS_ORIGIN_ALLOW_ALL = True

JWT_AUTH = {
    'JWT_AUTH_HEADER_PREFIX': 'Token',
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
}

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'jet.dashboard.modules.auth.backends.CustomUserBackend',
)

其中,INSTALLED_APPS中添加了rest_frameworkrest_framework.authtoken,并设置了DEFAULT_AUTHENTICATION_CLASSES为TokenAuthentication,DEFAULT_PERMISSION_CLASSES为IsAuthenticated,JWT_AUTH_HEADER_PREFIX设置了Token的前缀,JWT_EXPIRATION_DELTA设置了Token的过期时间,JWT_ALLOW_REFRESH设置了是否允许刷新Token,JWT_REFRESH_EXPIRATION_DELTA设置了刷新Token的过期时间。

测试JET令牌身份验证

在Django UTC-1项目中创建一个hello接口用于测试JET令牌身份验证。

# views.py

from rest_framework.response import Response

@api_view(['GET'])
def hello(request):
    user = request.user
    if user.is_authenticated:
        return Response(data={'message': 'Hello ' + user.username})
    else:
        return Response(data={'message': 'Hello Stranger'})

然后在路由中添加hello接口的路径。

# urls.py

from django.urls import path
from .views import hello

urlpatterns = [
    path('hello/', hello),
]

在Postman中向hello接口发送请求,请求头中携带Token。

Authorization: Token <Token>

如果Token验证通过,服务器会返回Hello <username>的响应,否则会返回Hello Stranger的响应。