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

OAuth/OIDC 客户端服务器用户登录/创建标准流程及会话令牌问题

基于OIDC ID Token实现Django用户会话的标准方案

一、生成客户端受保护路由会话令牌的标准流程

1. 先严格验证ID Token的合法性

这是核心前置步骤,绝对不能省略。你需要用pyjwt或django-oidc类库验证以下内容:

  • ID Token的签名是否为Google官方签发(用Google公钥验证)
  • iss字段是否为https://accounts.google.com
  • aud字段是否匹配你的应用客户端ID
  • 令牌是否未过期(检查exp字段)

只有验证通过的ID Token,其中的用户信息才具备可信度。

2. 关联或创建Django用户

优先使用ID Token中的sub字段(Google用户的永久唯一标识,比email更稳定,用户可能修改邮箱但sub不会变)查询PostgreSQL数据库:

  • 找到匹配用户则直接关联
  • 未找到则用sub、email、name等字段创建新的Django用户

3. 生成会话令牌(两种主流方案)

方案1:使用Django原生会话机制

这是最省心的标准方案,直接调用Django自带认证方法:

from django.contrib.auth import login
from django.contrib.auth.models import User

# 假设已从验证后的ID Token中提取sub和email
user, created = User.objects.get_or_create(username=id_token['sub'], email=id_token['email'])
login(request, user)

执行login()后,Django会自动在客户端设置sessionid Cookie,后续用户访问受保护路由时,Django会自动校验该Cookie,无需额外处理。

方案2:使用JWT作为会话令牌(适合前后端分离场景)

如果客户端是SPA或移动端,推荐用JWT替代Cookie,可借助djangorestframework-simplejwt库实现:

from rest_framework_simplejwt.tokens import RefreshToken

# 关联用户后生成令牌
refresh = RefreshToken.for_user(user)
access_token = str(refresh.access_token)
# 将access_token返回给客户端,前端后续请求在Authorization头携带:Bearer {access_token}

二、生成独立会话令牌是否需要ID Token信息?

是的,但必须是经过合法性验证后的ID Token信息。

  • 会话令牌的核心作用是标识用户身份,因此必须从可信的ID Token中提取用户唯一标识(如sub),关联到你的Django用户模型,才能生成对应身份的会话令牌。
  • 若直接使用未验证的ID Token信息,攻击者可伪造ID Token冒充任意用户,完全失去认证意义。

参考资料翻译

  • YouTube视频《OAuth 2.0 and OpenID Connect (in plain English)》:用通俗语言讲解OAuth 2.0和OIDC的核心概念,包括令牌类型、授权流程等基础内容。
  • Auth0 Django示例项目:展示了如何在Django中集成OIDC认证,涵盖ID Token验证、用户同步、会话管理的完整实现代码。

内容的提问来源于stack exchange,提问作者Chris Galey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:22:50