OAuth2 身份验证:使用 Authentik 实现安全登录
身份验证是任何 Web 应用程序中最安全的组件,但 61% 的数据泄露涉及凭据泄露。 使用 Authentik 等专用身份提供商实施 OAuth2,可将身份验证问题与应用程序逻辑分开,从而实现单点登录、MFA 和集中式用户管理。
要点
- OAuth2 授权代码流与 PKCE 是 Web 应用程序的推荐模式
- Authentik 提供具有 OIDC、SAML 和 LDAP 支持的自托管身份提供商
- 用于令牌存储的 HttpOnly cookie 可防止基于 XSS 的令牌盗窃
- 具有短 TTL 的一次性交换代码可防止 URL 中的令牌暴露
OAuth2 流程概述
PKCE 授权代码流程
- 用户单击登录:应用程序重定向到 Authentik 授权端点
- 用户身份验证:在 Authentik 登录页面上输入的凭据(和 MFA)
- 已发出授权代码:Authentik 使用短期代码重定向回来
- 令牌交换:后端交换访问和刷新令牌的代码
- 会话建立:令牌存储在 HttpOnly cookie 中
此流程可确保凭据永远不会接触您的应用程序、服务器到服务器的令牌交换,并且授权代码是一次性的且具有短 TTL。
真实设置
提供者配置
在 Authentik 中创建 OAuth2/OIDC 提供程序,其中包含机密客户端类型、唯一客户端 ID、强客户端机密、精确重定向 URI、openid/个人资料/电子邮件范围和适当的令牌生命周期(访问:5-15 分钟,刷新:7-30 天)。
将提供程序绑定到 Authentik 应用程序,以通过基于组成员身份、属性或 IP 限制的策略来控制访问。
多重身份验证
配置 MFA 选项:TOTP(Google 身份验证器、Authy)、WebAuthn(硬件安全密钥、生物识别)和 SMS/电子邮件代码作为后备。
后端实现
授权重定向
使用 client_id、response_type=code、redirect_uri、范围、随机状态参数(CSRF 保护)和 PKCE code_challenge 将用户重定向到 Authentik。
代币交换
在回调时,使用 grant_type=authorization_code、收到的代码、redirect_uri、客户端凭据和 PKCE code_verifier 交换服务器到服务器的授权代码。响应包含access_token、refresh_token、id_token和过期信息。
安全令牌存储
切勿将令牌存储在 localStorage 或 sessionStorage 中 - 任何 JavaScript 都可以访问它们,包括 XSS 有效负载。使用带有安全标志、SameSite=Lax 和适当过期时间的 HttpOnly cookie。
前端集成
登录流程
用户单击“登录”,前端重定向到授权 URL,用户在 Authentik 上进行身份验证(您的应用程序永远不会看到凭据),Authentik 使用代码重定向回来,后端交换代码并设置 HttpOnly cookie,前端调用当前用户数据的会话端点。
会话管理
创建一个 useAuth() 挂钩,在挂载时调用 GET /auth/session。如果通过身份验证,则返回用户数据;如果未通过身份验证,则重定向到登录。注销时,调用 POST /auth/logout 来清除 cookie。
受保护的路由
使用中间件在页面呈现之前重定向未经身份验证的用户。在 Next.js 中,proxy.ts 文件通过检查受保护路由上的身份验证 cookie 来处理此问题。
安全最佳实践
令牌安全
- 专门使用 HttpOnly cookie —— 绝不向 JavaScript 公开令牌
- 访问令牌生命周期短(5-15 分钟)
- 令牌刷新轮换(每次使用新的刷新令牌)
- 客户端秘密仅存储在后端,从不存储在前端代码中
重定向安全
- 根据白名单验证所有重定向 URL
- 拒绝以 // 开头的重定向(协议相关 URL)
- 切勿在 URL 参数中包含令牌
- 使用 60 秒 TTL 的一次性交换代码
会话安全
- 身份验证后重新生成会话标识符
- 实施空闲超时(30分钟)和绝对超时(8小时)
- 记录所有身份验证事件以进行审计跟踪
- 限制登录尝试速率以防止暴力破解
Authentik 高级功能
用户注册
使用可自定义的注册流程配置自助用户注册。定义新帐户的必填字段、电子邮件验证步骤和审批工作流程。
品牌定制
将自定义 CSS、徽标和主题应用到 Authentik 登录页面,以获得无缝的品牌体验。自定义品牌必须通过 CSS 卷挂载或 Django ORM Branding_custom_css 字段应用。
用户联盟
通过 LDAP/Active Directory 同步将 Authentik 连接到外部用户目录,使现有企业用户无需重新创建帐户即可进行身份验证。
常见问题
问:为什么选择 Authentik 而不是 Auth0 或 Keycloak?
Authentik 是自托管(完全数据控制)、开源的,并拥有现代化的 UI。 Auth0 是 SaaS,每用户定价不断升级。 Keycloak 是自托管的,但具有更陡峭的学习曲线和较旧的 UI。 Authentik 平衡了功能、可用性和成本。
问:Authentik 可以处理数千名用户吗?
是的。 Authentik 基于 Django 和 PostgreSQL 构建,可处理大量用户群。对于10万+用户,保证足够的数据库资源,并考虑横向扩展。
问:我们如何跨多个应用程序实现 SSO?
将每个应用程序配置为具有自己的提供程序的单独 Authentik 应用程序。用户进行一次身份验证,然后通过 Authentik 会话自动登录到所有连接的应用程序。
问:社交登录怎么样?
Authentik 支持开箱即用的社交登录源——Google、GitHub、Microsoft 和其他 OAuth2 提供商。用户可以将社交帐户与其 Authentik 身份关联起来,以方便登录。
下一步是什么
对于大多数 Web 应用程序来说,具有专用身份提供商的 OAuth2 是最有影响力的安全改进。它消除了凭证处理、启用 MFA 并提供集中审计日志记录。
联系 ECOSIRE 获取身份验证实施帮助,或探索我们的 Odoo 实施服务 以实现安全 ERP 部署。
由 ECOSIRE 发布——帮助企业利用企业软件解决方案进行扩展。
作者
ECOSIRE Research and Development Team
在 ECOSIRE 构建企业级数字产品。分享关于 Odoo 集成、电商自动化和 AI 驱动商业解决方案的洞见。
相关文章
Odoo 安全和访问控制:保护您的业务数据
Odoo 安全性综合指南 — 用户组、访问权限、记录规则、字段级安全性、双因素身份验证、审核日志记录和生产部署的安全最佳实践。
OpenClaw Enterprise 安全性:数据隐私、访问控制和合规性
OpenClaw 企业安全综合指南,涵盖数据隐私控制、基于角色的访问、加密、审核日志记录、SOC 2 合规性和部署安全最佳实践。
OpenClaw 安全性:生产部署强化指南
OpenClaw 的基本安全实践:Docker 强化、凭证隔离、网络分段、技能审查和企业合规性。保护您的 AI 代理部署。