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

如何让外部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:15:21