django-allauth Headless API 完全指南:一套认证接口同时服务浏览器 SPA 与移动端 App
后端认证鉴权身份认证【免费下载链接】django-allauthIntegrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication. Mirror of https://codeberg.org/allauth/django-allauth/项目地址https://gitcode.com/gh_mirrors/dj/django-allauth点击查看免费下载导读django-allauth 在allauth/headless子应用中提供了一套与渲染层无关的Headless API让前端浏览器中的 React/Vue 单页应用与后端Android/iOS 等移动应用通过同一套 JSON 接口完成登录、注册、密码找回、邮箱管理、两步验证2FA、第三方社交账号接入与会话管理。本文以 Headless API 规范文档 为骨架结合仓库源码系统讲解其客户端模型、安全机制、X-Session-Token会话令牌协议、可插拔访问令牌策略、统一响应结构、认证流程编排以及 OpenAPI 规范文档的动态生成机制——读完即可在自己的前后端分离项目中正确接入这套 API。一、API 面向的两类客户端与核心安全差异Headless API 的定位是同时服务两种截然不同的客户端规范文档 一开始就做了明确区分客户端类型典型形态安全模型Browser运行在浏览器中的单页应用如 React SPA用户通过浏览器导航访问使用 Django 常规 session 与 session cookie必须防御 CSRF跨站请求伪造攻击App非浏览器环境中的应用如 Android/iOS 移动应用cookie 不参与改用X-Session-Token请求头携带会话令牌二者的安全考量完全不同浏览器场景下 cookie 天然会被浏览器自动携带若不加防护Web 应用容易遭受 CSRF 攻击移动应用则不存在这一问题。而 API 本身为两种场景共用——安全处理的差异由请求路径自动区分。从 URL 定义 可以看到browser与app被实现为两个独立的 URL 命名空间统一挂载在v1/版本前缀之下/_allauth/browser/v1/auth/signup—— 浏览器场景/_allauth/app/v1/auth/signup—— App 场景其中app客户端还会额外挂载/tokens/相关的令牌刷新端点仅Client.APP分支挂载见 urls.py。规范中所有端点的路径均以/_allauth/{client}/v1/...的占位形式记录具体到某个客户端时在请求/响应处理上可能略有差异规范会逐一标注。默认情况下两种客户端都启用由HEADLESS_CLIENTS设置控制默认(browser, app)见 app_settings.py。若你的项目只服务一种客户端可以只保留一种生成的 OpenAPI 文档也会随之裁剪。二、API 功能范围Scope规范明确列出这套 API 覆盖的全部能力常规账户登录Login、注册Signup、忘记密码Password forgotten、邮箱管理添加、移除、验证、切换主邮箱、修改密码、邮箱地址验证。两步验证2FA使用验证器代码认证、启用/停用 TOTP、重新生成恢复码、信任此浏览器。第三方提供商Social Account通过浏览器级重定向同步认证、通过提供商令牌认证、连接更多提供商账号、断开已有提供商账号、在未设置密码时设置密码、注册前查询附加信息。会话管理列出用户的所有会话、登出其中任意一个会话。对应到 OpenAPI 规范的 tag 分组见 openapi.yaml接口被组织为Configuration配置信息、Authentication账户认证、密码重置、提供商、2FA、Code 登录、WebAuthn 登录/注册、Account邮箱、密码、手机号、提供商、2FA、WebAuthn 管理、Sessions会话、Tokens令牌。三、Browser 使用路由配置与 CSRF 防护浏览器场景沿用 Django 常规 session 与 session cookie因此关键在于**路由Routing**的正确配置确保后端建立的会话在前后端分离的部署下可用。规范给出两种方案3.1 单域名路径路由前端与后端从同一个域名如https://app.org提供服务只需约定一部分路径交给前端、另一部分交给后端。此时 cookie 的作用域天然一致配置最简单。3.2 子域名路由前端与后端位于不同子域但由于仍依赖 session cookie两个子域必须共享同一个主域。例如前端app.project.org对接后端backend.project.org则 Django 需要配置SESSION_COOKIE_DOMAIN project.org CSRF_COOKIE_DOMAIN project.org需要特别注意的是如果组织还在顶级域project.org上托管了无关应用例如营销用的 CMS将 cookie 域设为project.org会让这些应用也能读到 session cookie存在安全隐患。此时规范建议后端使用backend.app.project.org并将 cookie 域设为app.project.org把 cookie 限制在认证应用的子域范围内。四、App 使用Session Token 会话令牌协议App 场景不使用 cookie但会话机制依然存在用户走完认证流程时会创建会话已认证的会话是允许继续与后端交互的凭证同时未认证的会话也用于在用户逐步完成认证所需步骤时记忆中间状态。4.1 会话令牌的工作方式没有 cookie 指向会话App 客户端改用X-Session-Token请求头携带会话令牌。规范规定的交互协议如下尚无会话令牌时不要发送X-Session-Token请求头。获取并保存令牌与认证相关的响应元数据中可能携带meta.session_token。一旦出现客户端应将其保存覆盖之前保存的旧令牌并在后续所有请求中放入X-Session-Token请求头。处理会话失效当收到认证相关响应的状态码410Gone时表示会话已失效客户端应删除本地令牌并从头开始。从源码看sessionkit.py 中的expose_session_token()只在会话被修改且非空时生成并暴露新令牌并且仅对Client.APP场景生效——这正是会话令牌出现在认证相关响应元数据中的实现依据。而 sessionkit.py 的authenticate_by_x_session_token()则负责根据请求头中的令牌反查会话、解析出user_id并校验用户处于激活状态完成无 cookie 的认证。4.2 默认的 SessionTokenStrategy 实现默认的令牌策略是 SessionTokenStrategy它直接复用 Django session 的session_key作为会话令牌create_session_token()确保 session 已保存后返回session_keylookup_session()则通过session_store().exists()校验令牌对应的会话是否仍存在。也就是说App 客户端拿到的是一个不透明的会话标识服务端借此定位真实的 Django session。五、Access Token可插拔的访问令牌策略会话令牌只负责认证过程本身认证完成之后你的 App 往往还需要访问其他 API——这些 API 可能用完全不同的技术栈实现此时一个**无状态令牌如编码了用户 ID 的 JWT**往往是更合适的选择。规范明确指出API 本身对访问令牌不做任何假设也不做限制性的设计决策。django-allauth 的令牌策略是可插拔的pluggable你可以在用户完成认证时通过自定义策略暴露自己的访问令牌。对 API 规范而言访问令牌只会出现在成功认证请求响应的元数据meta.access_token中。在 AbstractTokenStrategy 抽象基类中可以看到完整设计get_session_token(request)从X-Session-Token请求头读取令牌默认实现。create_session_token(request)/lookup_session(token)抽象方法负责创建/反查会话令牌必须由子类实现。create_access_token(request)默认返回None即默认不产生访问令牌需要时由自定义策略返回 JWT 等令牌。create_access_token_payload(request)将访问令牌包装为{access_token: ...}响应载荷可扩展refresh_token、expires_in等信息。refresh_token(refresh_token)默认返回None如需刷新令牌由子类实现校验与换发逻辑。自定义策略通过HEADLESS_TOKEN_STRATEGY设置指定默认allauth.headless.tokens.strategies.sessions.SessionTokenStrategy见 app_settings.py。若需要 JWT仓库还提供了完整的 JWT 相关设置HEADLESS_JWT_ALGORITHM默认RS256、HEADLESS_JWT_PRIVATE_KEY、HEADLESS_JWT_ACCESS_TOKEN_EXPIRES_IN默认 300 秒、HEADLESS_JWT_REFRESH_TOKEN_EXPIRES_IN默认 86400 秒等见 app_settings.py以及独立的 JWT 策略实现目录。具体定制方式可参阅allauth.headless应用文档与 token 策略文档。六、统一响应结构Responses除非某个端点另有说明所有响应都是一个 JSON 对象包含以下属性status与 HTTP 状态码一致。data数据若有。meta元数据若有。errors错误列表若有。这一约定在 openapi.yaml 中以ErrorResponse、Authenticated等组件 schema 的形式落实客户端可以统一解析这四种键无需为每个端点单独适配。七、认证流程Authentication Flows编排用户完成认证往往需要走完一个可能包含多个步骤的流程flow。规范给出的示例一次登录随后即完成认证登录后进入两步验证随后完成认证注册后必须验证邮箱验证通过后完成认证。7.1 状态码语义API 通过401/410状态码向客户端传递需要重新认证的信号状态码含义附加信息401未认证—401需要重新认证meta.is_authenticated true410会话失效仅出现在app类型客户端所有认证相关响应都具有401或410状态码并通过meta.is_authenticated指示是需要认证还是需要重新认证。7.2 可执行的认证流程清单客户端可发起的认证流程随认证相关响应一并告知客户端login本地账户登录。signup本地账户注册。provider_redirect通过第三方提供商重定向流程登录或注册。provider_token通过其他渠道取得的第三方提供商令牌登录或注册。login_by_code使用一次性特殊代码登录。mfa_login_webauthn使用 PasskeyWebAuthn登录。mfa_signup_webauthn使用 PasskeyWebAuthn注册。视账户状态与 django-allauth 配置以上流程可能直接完成认证也可能进入后续流程provider_signup提供商注册需补充信息。verify_email邮箱验证。phone_email手机号验证规范文档原文如此命名对应手机验证阶段。mfa_authenticate需要两步验证TOTP、恢复码或 WebAuthn。mfa_trust信任此浏览器。7.3 重新认证流程已认证状态下执行敏感操作时可能要求重新认证以保护账户reauthenticate使用密码重新认证。mfa_reauthenticate使用 2FA 验证器TOTP、恢复码或 WebAuthn重新认证。这套流程即状态的设计让客户端只需跟随响应中给出的流程逐步推进无需硬编码业务分支。八、安全考量输入净化与 XSS 防御规范特别提醒了一个容易被忽视的安全问题Django 框架设计上不执行输入净化input sanitization。例如没有任何机制阻止用户用script或Robert); DROP TABLE students作为名字注册。Django 依赖模板语言对这类值进行正确转义来缓解 XSS 攻击。因此所有allauth.headless客户端自身必须具备完善的 XSS 防护。规范举例说明WebAuthn 端点完全可能返回如下内容的验证器名称——{ name: scriptalert(1)/script, credential: { type: public-key, ...: ... } }这意味着前端在渲染后端返回的任何字符串字段时都必须当作不可信数据对待做好转义与消毒不能想当然地认为服务端已经过滤了恶意内容。九、OpenAPI 规范文档动态生成与按需裁剪这套 API 的完整契约以 OpenAPI 3.0.3 格式维护在 openapi.yaml约 3600 行标题为 django-allauth: Headless API而你正在阅读的 description.md 正是该规范info.description的正文来源。二者由 schema.py 的get_schema()在运行时合并并经过一系列动态加工注入描述读取doc/description.md作为info.descriptionschema.py。路径重写chroot将规范中的/_allauth前缀替换为实际部署的 URL 根路径schema.py。固定客户端pin_client若HEADLESS_CLIENTS只配置了一种客户端则把{client}占位符替换为真实值并移除Client路径参数schema.py。裁剪未启用路径/标签用 Django URL resolver 逐一校验路径是否真实可路由删除不可达的路径与对应 tagschema.py。定制注册字段根据ACCOUNT_SIGNUP_FIELDS设置动态生成BaseSignup/Signupschema 的必填字段schema.py。定制注册表单从实际的注册表单类读取base_fields将自定义字段及其约束类型、长度、帮助文本合并进规范schema.py字段类型映射逻辑见 openapikit.py。定制 User schema通过 headless adapter 获取用户数据类dataclass自动生成Userschema 与示例schema.py。也就是说你部署环境中的配置会直接反映到交付给前端的 OpenAPI 文档里前端团队拿到的永远是精确匹配当前后端配置的接口契约。9.1 如何在项目中暴露规范文档规范的 HTTP 端点定义在 spec/urls.pyopenapi.yaml→OpenAPIYAMLView以application/vnd.oai.openapi返回 YAMLopenapi.json→OpenAPIJSONView以application/vnd.oai.openapijson返回 JSONopenapi.html→OpenAPIHTMLView基于 ReDoc 模板渲染交互式文档views.py。但注意规范端点默认并不挂载。需要两步开启在INSTALLED_APPS包含allauth.headless并确保主 URL 配置中包含了 headless 的 URLconf/_allauth/前缀下挂载allauth.headless.urls。设置HEADLESS_SERVE_SPECIFICATION True否则 urls.py 不会把 spec 路由包含进来。HTML 视图还受HEADLESS_SPECIFICATION_TEMPLATE_NAME控制默认headless/spec/redoc_cdn.html且仅在SERVE_SPECIFICATION为真时注册见 spec/urls.py。9.2 前端启动时拉取配置规范还包含一个专门面向前端的配置端点GET /_allauth/{client}/v1/config见 openapi.yaml。它的设计意图是django-allauth 有大量会改变前后端行为的配置项因此把与前端相关的配置通过该端点暴露返回数据不依赖用户与认证状态应用启动时拉取一次即可。十、接入要点速览把整套机制落到实践中客户端接入的关键步骤如下路由与部署浏览器场景按单域名或子域名方案配置 Django必要时设置SESSION_COOKIE_DOMAIN/CSRF_COOKIE_DOMAINApp 场景无需 cookie 配置。发起认证对/_allauth/{client}/v1/auth/login或signup、provider_redirect等发起请求从响应meta中读取session_tokenApp 场景与access_token若配置了访问令牌策略。携带令牌App 客户端将所有后续请求的X-Session-Token头设置为最新会话令牌响应中出现新令牌则覆盖旧值收到410则清空本地令牌重新开始。推进流程根据认证相关响应中的 flow 提示verify_email、mfa_authenticate、reauthenticate等逐级完成认证直至meta.is_authenticated true。安全基线前端对所有后端返回的字符串做 XSS 转义不依赖服务端净化。结语django-allauth Headless API 的价值在于用{client}路径参数优雅地统一了浏览器与移动端两种安全模型迥异的客户端以X-Session-Token协议解决无 cookie 环境下的会话问题以可插拔令牌策略为访问令牌留足扩展空间并以流程编排 统一响应结构简化了多步骤认证的客户端实现。配合 schema.py 中按实际配置动态裁剪生成的 OpenAPI 规范前后端团队可以始终基于精确的契约进行联调。若需深入细节可直接阅读规范源文件、spec 生成实现、令牌策略基类 与 会话工具并结合 headless 安装文档 与 API 文档 在真实项目中实践。赞分享后端认证鉴权身份认证【免费下载链接】django-allauthIntegrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication. Mirror of https://codeberg.org/allauth/django-allauth/项目地址https://gitcode.com/gh_mirrors/dj/django-allauth点击查看免费下载相关推荐Quasar Integrations一套源码同时构建 SPA、SSR、SSG、PWA、移动端、桌面端与浏览器插件Quasar Integrations一套源码同时构建 SPA、SSR、SSG、PWA、移动端、桌面端与浏览器插件 Quasar Framework 的集成体前端UI组件跨平台django-allauth 官方示例项目完全指南Regular Django 模板化与 React SPA Headless 实战django allauth 官方示例项目完全指南Regular Django 模板化与 React SPA Headless 实战 本文档以 docs/in后端认证鉴权身份认证深入 Cypress packages/socket一套同时服务 Node 与浏览器端的 socket.io 双向通信封装深入 Cypress packages/socket 一套同时服务 Node 与浏览器端的 socket.io 双向通信封装 本篇技术文章以 Cypress测试质量保障前端接口测试上一篇Qwen Code 的 qwen-code /resolve 命令用 AI Agent 自动解决 PR 合并冲突的完整设计下一篇在 Laradock 中用 Ollama 运行本地 LLMOpenAI 兼容 API、模型管理与 GPU 加速完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考