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

Django:如何捕获第三方服务的授权token并完成本地用户认证

Django 第三方认证Token回调处理实现方案

1. 配置回调路由

首先在Django应用的urls.py中添加第三方服务的重定向回调路由,该路由地址需要提前同步给第三方认证服务作为白名单回调地址:

from django.urls import path
from . import views

urlpatterns = [
    # 原有其他路由
    path('oauth/callback/', views.oauth_callback, name='oauth_callback'),
]

2. 回调视图核心逻辑

在views.py中实现回调处理逻辑,完整流程如下:

  • 第一步:捕获第三方回传的token参数,做空值校验
  • 第二步:校验token的合法性,按第三方提供的规则选择本地验签或者调用第三方校验接口
  • 第三步:匹配/创建本地Django用户账号,和第三方用户唯一标识做绑定
  • 第四步:调用Django原生登录方法完成身份认证,跳转到应用内页面

完整代码示例:

from django.http import HttpResponseBadRequest, HttpResponseForbidden
from django.shortcuts import redirect
from django.contrib.auth import get_user_model, login
import requests

User = get_user_model()

def oauth_callback(request):
    # 1. 提取回调参数中的token
    token = request.GET.get('token')
    if not token:
        return HttpResponseBadRequest("缺少有效认证凭证")
    
    # 2. 校验token有效性,此处为调用第三方校验接口的示例,可替换为本地公钥验签逻辑
    verify_url = "第三方服务提供的token校验接口地址"
    try:
        verify_resp = requests.post(
            verify_url,
            json={"token": token},
            timeout=5
        )
        verify_resp.raise_for_status()
        verify_data = verify_resp.json()
    except requests.exceptions.RequestException:
        return HttpResponseForbidden("认证服务响应异常,请稍后重试")
    
    if not verify_data.get("valid"):
        return HttpResponseForbidden("认证凭证已失效或非法")
    
    # 提取第三方返回的用户唯一标识和基础信息
    third_user_info = verify_data.get("user_info", {})
    third_uid = third_user_info.get("uid")
    if not third_uid:
        return HttpResponseForbidden("无法获取用户标识信息")
    
    # 3. 匹配本地用户,无匹配则自动创建新用户
    try:
        user = User.objects.get(third_party_uid=third_uid)
    except User.DoesNotExist:
        # 新用户创建,字段根据实际业务需求调整
        user = User.objects.create(
            username=third_user_info.get("username", f"oauth_{third_uid[:8]}"),
            email=third_user_info.get("email", ""),
            third_party_uid=third_uid,
            # 其他用户字段按需补充
        )
        user.set_unusable_password() # 第三方登录用户默认不设置本地密码
        user.save()
    
    # 4. 完成本地登录,跳转至应用首页或用户访问的原页面
    login(request, user)
    # 若需要跳回登录前的页面,可在跳转第三方前将原地址存在session中,此处取出跳转即可
    return redirect("/")

3. 前置依赖与优化建议

  • 需要提前给Django的用户表新增third_party_uid字段,添加唯一索引避免重复绑定,字段示例:
    third_party_uid = models.CharField(max_length=64, unique=True, null=True, blank=True, verbose_name="第三方用户唯一标识")
    
  • 生产环境下建议对第三方接口返回的所有用户信息做严格的格式校验,避免异常数据导致服务出错
  • token校验逻辑建议添加缓存,避免同一个token多次请求第三方校验接口,提升响应速度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:09:03