如何让外部API认证的用户免重复登录访问Django Admin?
解决Django Admin与外部Token认证免重复登录的方案
核心原因
Django Admin默认依赖Session认证,而你的外部登录接口返回的是Token,两者认证机制不共享会话状态,所以用户需要重复登录。要实现免登,需将Token认证的用户转换为Django的Session会话。
具体实现步骤
1. 在Django中添加会话转换接口
新增一个API视图,接收前端传来的Token,验证通过后为用户创建Django登录会话:
from rest_framework.decorators import api_view, authentication_classes, permission_classes from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated from django.contrib.auth import login from rest_framework.response import Response from rest_framework import status @api_view(["POST"]) @authentication_classes([TokenAuthentication]) @permission_classes([IsAuthenticated]) def convert_token_to_session(request): # 手动为用户创建Django登录会话 login(request, request.user) # 返回成功响应,此时Django已设置session cookie return Response({"success": True}, status=status.HTTP_200_OK)
2. 配置Django跨域与Cookie参数
因为Next Auth服务器独立部署,需配置Django允许跨域请求并支持携带凭证:
- 安装依赖:
pip install django-cors-headers - 在
settings.py中添加配置:
INSTALLED_APPS = [ # ...其他应用 'corsheaders', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', # 放在中间件列表最前面 # ...其他中间件 ] # 允许你的Next.js服务器域名 CORS_ALLOWED_ORIGINS = [ "https://your-nextjs-domain.com", # 替换为实际部署域名 ] # 允许携带凭证(Cookie、HTTP认证信息等) CORS_ALLOW_CREDENTIALS = True # 配置Session Cookie的跨域属性 SESSION_COOKIE_SAMESITE = 'Lax' # 跨域HTTPS场景可设为'None' SESSION_COOKIE_SECURE = True # 生产环境开启HTTPS时必填
3. Next.js端调用会话转换接口
用户通过Next Auth完成登录并拿到Token后,调用Django的会话转换接口,携带Token并允许凭证传递:
// 封装转换会话的函数 async function convertTokenToSession(token) { await fetch('https://your-django-domain.com/api/convert-token-to-session/', { method: 'POST', headers: { 'Authorization': `Token ${token}`, 'Content-Type': 'application/json', }, credentials: 'include', // 关键:允许携带Cookie }); } // 在Next Auth的回调中触发转换逻辑 export async function jwt({ token, user }) { if (user) { // 用户登录成功后立即调用转换接口 await convertTokenToSession(user.token); } return token; }
4. 验证效果
用户完成Next Auth登录后,再访问Django Admin时,浏览器会自动携带Django生成的Session Cookie,无需重复输入账号密码即可登录。
内容的提问来源于stack exchange,提问作者Ahmed Wagdi
相关产品推荐
相关产品推荐

