Ory Kratos 实战:为 Next.js 构建开源自托管认证

Ory Kratos 是开源的身份认证服务器:注册、登录、邮箱验证、双因素认证全开源自托管。本文实战 Kratos + Next.js 完整认证系统。

最佳实践
事件循环与异步任务流转插画

Ory Kratos 是 API 优先的开源身份服务器:Docker 启动 + 一份配置文件定义认证流程,前端通过 Kratos 的浏览器流(flow)API 实现注册/登录/验证/2FA。它让你拥有 Auth0 级能力而不交数据主权。

为什么是 Kratos

自研认证的坑深不见底(密码哈希、会话安全、账号恢复、2FA……);托管服务(Auth0/Okta)省心但用户数据在别人手里、定制受限。Kratos 的定位:企业级认证能力 + 完全自托管 + UI 完全自定义(backend-only,不绑架你的前端)。

环境搭建

# docker-compose.yml 核心服务
services:
  kratos:
    image: oryd/kratos:v1
    volumes:
      - ./kratos:/etc/config/kratos
    command: serve -c /etc/config/kratos/kratos.yml --dev --watch-courier

kratos.yml 定义:身份 Schema(用户字段)、认证方法(密码/通行密钥/TOTP)、流程设置(注册后是否需邮箱验证)。

核心概念:Flow

Kratos 的认证交互是"流程"(Flow)模型:

  1. 前端请求 GET /self-service/login/browser 创建登录流程;
  2. Kratos 返回流程 ID 与表单结构(需要哪些字段、CSRF token);
  3. 用户提交表单到 Kratos;
  4. 成功后 Kratos 设置会话 Cookie,重定向回应用。

前端只渲染 Kratos 描述的表单——表单字段、校验规则、错误消息全部后端驱动。Next.js 侧用 @ory/elements 或自建组件渲染 flow 的 UI 节点。

注册、登录与验证

// Next.js 中获取登录流程
import { FrontendApi, Configuration } from '@ory/client';

const kratos = new FrontendApi(new Configuration({
  basePath: 'http://localhost:4433',
}));

const { data: flow } = await kratos.createBrowserLoginFlow();
// flow.ui.nodes 描述了表单:渲染它们即可

邮箱验证与 2FA 同理:flow 模型统一处理——verification flow 发验证邮件,settings flow 管理 2FA 绑定。

会话校验

// 服务端组件中校验登录态
const { data: session } = await kratos.toSession({ cookie: request.headers.get('cookie') });
// session.identity 即用户身份

中间件统一校验、未登录重定向到 /auth/login——Next.js 的标准模式与 Kratos 无缝配合。

常见问题(FAQ)

Q:Kratos 和 NextAuth 怎么选?

NextAuth 是库(嵌在应用里,简单场景快);Kratos 是独立服务(多应用共享身份、审计、企业能力)。单应用简单认证 NextAuth 起步,多应用/合规要求 Kratos。

Q:自托管的运维负担大吗?

Kratos 本体是无状态 Go 服务 + PostgreSQL——部署简单。运维重点:邮件通道(courier)可靠性与数据库备份。小规模团队一个容器即可起步。

Q:社交登录(GitHub/Google)支持吗?

支持——配置 OIDC provider 即可,与密码认证并存于同一身份模型。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台