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 TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
相关文章
电子商务人工智能欺诈检测:在不阻止销售的情况下保护收入
实施 AI 欺诈检测,捕获 95% 以上的欺诈交易,同时将误报率控制在 2% 以下。机器学习评分、行为分析和投资回报率指南。
API 速率限制:模式和最佳实践
通过令牌桶、滑动窗口和固定计数器模式掌握 API 速率限制。使用 NestJS 节流器、Redis 和实际配置示例保护您的后端。
Authentik OIDC/SSO:完整集成指南
完整的 Authentik OIDC 和 SSO 集成指南:OAuth2 提供程序设置、Next.js 回调处理、NestJS JWT 验证、用户配置和生产配置。