dj-rest-auth的ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION不生效如何解决
问题原因
dj-rest-auth 自带的
VerifyEmailView重写了父类ConfirmEmailView的post方法,完全跳过了 allauth 中LOGIN_ON_EMAIL_CONFIRMATION对应的自动登录逻辑,且父类原逻辑返回的是重定向响应,不适用于JWT的前后端分离场景,因此仅返回验证成功的提示。
解决步骤
1. 自定义邮箱验证视图
创建自定义的VerifyEmailView,在邮箱确认完成后为用户生成JWT凭证返回:
from rest_framework import status from rest_framework.response import Response from dj_rest_auth.registration.views import VerifyEmailView from rest_framework_simplejwt.tokens import RefreshToken from allauth.account import app_settings as allauth_account_settings class CustomVerifyEmailView(VerifyEmailView): def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.kwargs['key'] = serializer.validated_data['key'] confirmation = self.get_object() confirmation.confirm(self.request) # 仅开启自动登录配置时返回JWT凭证,兼容原有配置逻辑 if allauth_account_settings.LOGIN_ON_EMAIL_CONFIRMATION: user = confirmation.email_address.user # 生成Simple JWT访问凭证 refresh = RefreshToken.for_user(user) return Response({ 'detail': 'ok', 'access': str(refresh.access_token), 'refresh': str(refresh) }, status=status.HTTP_200_OK) return Response({'detail': 'ok'}, status=status.HTTP_200_OK)
注意:需确保
django-rest-framework-simplejwt已完成基础配置,令牌生成逻辑才会正常生效。如果需要和现有登录接口返回格式完全统一,也可直接调用dj-rest-auth自带的JWT响应生成方法替换手动生成令牌的逻辑。
2. 替换原有路由
在项目根路由urls.py中,将自定义视图的路由放在dj_rest_auth.registration的路由之前,覆盖原有接口:
from django.urls import path, include from yourapp.views import CustomVerifyEmailView # 替换为你实际的视图导入路径 urlpatterns = [ # 覆盖原有邮箱验证接口,必须放在dj_rest_auth的注册路由前面才能生效 path('dj-rest-auth/registration/verify-email/', CustomVerifyEmailView.as_view(), name='rest_verify_email'), # 其他路由 path('dj-rest-auth/registration/', include('dj_rest_auth.registration.urls')), # ... 其余业务路由 ]
内容的提问来源于stack exchange,提问作者CSSer
相关产品推荐
相关产品推荐

