You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于JWT Authentication实现登录?现有Token登录代码改造求助

改用JWT Token实现登录的方案

1. 安装依赖

首先安装Django REST Framework的JWT扩展包:

pip install djangorestframework-simplejwt

2. 配置项目settings

在settings.py中添加相关配置:

INSTALLED_APPS = [
    # 已有APP...
    'rest_framework',
    'rest_framework_simplejwt',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

# 可选:自定义JWT有效期(按需修改)
from datetime import timedelta
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}

3. 实现登录视图

有两种方式可选:直接使用官方提供的视图,或者自定义适配邮箱登录的视图。

方式一:使用官方现成视图

在urls.py中配置路由即可,默认支持用户名+密码登录:

from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

urlpatterns = [
    # 其他路由...
    path('api/login/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/refresh-token/', TokenRefreshView.as_view(), name='token_refresh'),
]

方式二:自定义邮箱登录视图

如果需要用邮箱代替用户名验证,先自定义序列化器:

# serializers.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from django.contrib.auth import get_user_model
from rest_framework import serializers

User = get_user_model()

class EmailTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)
        # 可在token中添加自定义字段,比如用户邮箱
        token['email'] = user.email
        return token

    def validate(self, attrs):
        email = attrs.get('email')
        password = attrs.get('password')
        
        user = User.objects.filter(email=email).first()
        if not user or not user.check_password(password):
            raise serializers.ValidationError('邮箱或密码错误')
        
        # 给父类序列化器传入username字段(默认逻辑依赖它)
        attrs['username'] = user.username
        return super().validate(attrs)

然后创建自定义登录视图:

# views.py
from rest_framework_simplejwt.views import TokenObtainPairView
from .serializers import EmailTokenObtainPairSerializer

class LoginView(TokenObtainPairView):
    serializer_class = EmailTokenObtainPairSerializer

最后在urls.py中配置该视图的路由:

path('api/login/', LoginView.as_view(), name='email_login'),

4. 使用说明

  • 登录请求:前端POST请求到登录接口,传入email和password,接口会返回access(访问令牌)和refresh(刷新令牌)。
  • 后续认证:在需要权限的请求头中添加Authorization: Bearer <access_token>,后端会自动验证令牌有效性。
  • 刷新令牌:当access过期时,用refresh请求刷新令牌接口,获取新的access。

内容的提问来源于stack exchange,提问作者Ero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:57:38