如何基于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
相关产品推荐
相关产品推荐

