fenghuo/OIDC_ARCHITECTURE_UPDATE.md

3.2 KiB
Raw Blame History

OIDC 架构更新总结

🎯 更新目标

将项目从混合认证架构改为标准的 OIDC 架构,确保所有用户认证都在 OIDC Provider 中处理。

🔄 主要改动

1. 删除客户端登录页面

  • 删除了 apps/web/app/auth/login/page.tsx
  • 删除了客户端应用中的自定义认证逻辑

2. 修复回调页面

  • 更新 apps/web/app/auth/callback/page.tsx 中的错误链接
  • 移除对已删除登录页面的引用

3. 添加测试页面

  • 创建 apps/web/app/test-oidc/page.tsx 用于测试OIDC流程
  • 在首页添加测试页面链接

4. 更新文档

  • 更新 apps/backend/README.md 以反映正确的架构

🏗️ 当前架构

正确的 OIDC 流程

用户点击登录
    ↓
客户端重定向到 OIDC Provider 授权端点
    ↓
OIDC Provider 显示内置登录页面
    ↓
用户在 Provider 页面上登录
    ↓
Provider 生成授权码并重定向回客户端
    ↓
客户端用授权码换取令牌
    ↓
认证完成

架构优势

已实现的正确做法

  • OIDC Provider 包含登录页面
  • 标准授权码流程
  • PKCE 支持
  • 内置会话管理
  • 自动令牌刷新

已移除的错误做法

  • 客户端应用的登录页面
  • 自定义认证逻辑
  • 重复的用户管理
  • 混合认证流程

🧪 测试方法

1. 访问测试页面

访问 http://localhost:3001/test-oidc 进行完整的流程测试

2. 测试 Discovery 端点

在测试页面点击"测试 Discovery 端点"按钮

3. 完整认证流程测试

  1. 在测试页面点击"开始 OIDC 认证流程"
  2. 将跳转到 OIDC Provider 的内置登录页面
  3. 使用演示账号登录:demouser / demo123
  4. 登录成功后会重定向回客户端应用

🔧 技术细节

OIDC Provider 配置

export const oidcApp = createOIDCProvider({
    config: oidcConfig,
    useBuiltInAuth: true,
    builtInAuthConfig: {
        passwordValidator: validatePassword,
        sessionTTL: 24 * 60 * 60, // 24小时
        loginPageTitle: 'OIDC Demo 登录',
        brandName: 'OIDC Demo Provider',
    },
});

客户端配置

export const oidcConfig = {
    authority: 'http://localhost:3000/oidc',
    client_id: 'demo-client',
    redirect_uri: 'http://localhost:3001/auth/callback',
    response_type: 'code',
    scope: 'openid profile email',
    // ... 其他标准OIDC配置
};

📋 验证清单

  • 删除客户端登录页面
  • 修复回调页面引用
  • OIDC Provider 内置认证正常工作
  • 标准 OIDC 流程可以完整运行
  • Discovery 端点返回正确配置
  • 文档已更新
  • 测试页面可用

🚀 启动说明

  1. 启动后端 OIDC Provider

    cd apps/backend
    bun run dev
    
  2. 启动前端客户端:

    cd apps/web
    npm run dev
    
  3. 访问测试页面: http://localhost:3001/test-oidc

🎉 总结

现在项目已经完全符合标准的 OIDC 架构:

  • 分离关注点: OIDC Provider 专注于认证,客户端专注于业务逻辑
  • 标准合规: 完全符合 OpenID Connect 规范
  • 简化维护: 认证逻辑集中在 Provider 中
  • 更好的安全性: 用户凭据只在 Provider 中处理