应使用 django-oauth-toolkit 搭建授权服务器,因其支持标准 OAuth2/OpenID Connect 流程(如 /oauth/authorize、/oauth/token),而 django-allauth 仅适合作为客户端对接第三方登录,无法对外提供授权接口。

直接用 django-oauth-toolkit 搭建授权服务器,而不是拿 django-allauth 或 social-auth-app-django 去“对接自己”——后者是客户端库,方向完全反了。
为什么 django-allauth 不能当 SSO 认证中心用
它只做「去别人家登录」:比如你的 Django 站点跳转到 Google 登录页,拿回 token 和用户信息。但你没法用它对外提供 /oauth/authorize 或 /oauth/token 接口。常见错误现象包括:
- 配置完
allauth后,前端调/oauth/authorize返回 404 - 误以为在后台加个 GitHub App 就能给 Vue SPA 发 token,结果发现根本没有 token 签发逻辑
- 试图复用
SocialAccount模型做统一用户池,但第三方平台字段不一致(如微信没 email、QQ 没头像 URL),绑定失败率高
真正需要的是一个能响应标准 OAuth2 流程的授权服务器,django-oauth-toolkit 才是正解。
django-oauth-toolkit 最小可用配置要点
Django 4.2+ 下必须用 path(),老教程里 url(r'^oauth/', ...) 会直接报错。实操建议:
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 安装:
pip install django-oauth-toolkit==3.2.0(兼容 OpenID Connect,支持 PKCE) -
INSTALLED_APPS加'oauth2_provider',别漏掉python manage.py migrate oauth2_provider - 路由写死:
path('oauth/', include('oauth2_provider.urls', namespace='oauth2_provider')) - 创建 Application 时,
client_type必须按前端类型选:confidential(后端渲染 Web)、public(Vue/React SPA,强制走 PKCE)
不配 redirect_uris 或末尾斜杠不一致(如前端传 https://app.com/callback,后台填了 https://app.com/callback/),会卡在授权页返回 invalid_redirect_uri。
前端必须走 Authorization Code + PKCE,不能用 Implicit Flow
django-oauth-toolkit 默认禁用 response_type=token,因为 Implicit Flow 已被 OAuth 2.1 废弃,且 token 暴露在 URL 中不安全。Vue/React SPA 正确发起请求的方式是:
- 生成随机
code_verifier(43 字符 base64url 编码字符串) - 算出
code_challenge(SHA256 hash 后再 base64url 编码) - 跳转时带参数:
response_type=code&code_challenge_method=S256&code_challenge=xxx&redirect_uri=https%3A%2F%2Fapp.com%2Fcallback - 回调页收到
code后,用code_verifier换 token,后端校验code_challenge是否匹配
漏掉 PKCE 步骤,或前端没传 code_challenge_method,后端会返回 invalid_grant —— 这不是配置错,是协议强制要求。
userinfo endpoint 需要自己补全
django-oauth-toolkit 不自带 /oauth/userinfo,OIDC 场景下必须手动实现。关键点:
- 视图需校验
Authorization: Bearer <access_token></access_token>,并调用oauth2_provider.models.AccessToken.objects.get(token=...) - 返回 JSON 必须含
sub(用户唯一标识)、name、email等 OIDC 标准字段 - 若用户模型有自定义字段(如部门、工号),得手动映射进响应体,不能依赖
User默认字段 - 别忘了在
settings.py里配OAUTH2_PROVIDER['SCOPES'] = {'openid': 'OpenID Connect scope'},否则scope=openid请求会被拒绝
最易忽略的是 sub 字段必须全局唯一且不可变——用数据库自增 ID 有风险(重置库后变化),推荐用 uuid 或拼接 user.id + salt 生成。

















