这是自己一个小项目登录的真实设计,但是是让 AI 帮忙总结的 HLD。

🧱 一、系统背景

1. 第三方 SSO 登录流程

  • 用户点击“登录”按钮,将跳转至第三方 SSO 登录页面
  • 登录成功后,第三方将用户 重定向回前端页面,并在 URL 中 携带 session-token

例如:

https://frontend.example.com/login?session-token=abc123

🔐 二、认证流程设计

1. 登录流程(处理 session-token)

前端在登录页接收到 session-token 后:

[SSO 登录成功]
     ↓
[前端登录页接收 session-token]
     ↓
[调用后端 /api/auth/validate-session]
     ↓
[后端验证 token → 设置 HttpOnly Cookie]
     ↓
[前端拉取用户信息,存入内存]

🔄 三、前后端交互流程

✅ 前端请求设置(React)

fetch('https://api.example.com/api/auth/validate-session', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ sessionToken }),
  credentials: 'include', // 关键:允许带 cookie
})
  • 所有接口请求都需设置:credentials: 'include'
  • Axios 示例:axios.post(..., { withCredentials: true })

✅ 后端响应设置(Next.js)

在 Next.js 的 API Route 中设置响应头(动态设置 CORS):

const allowedOrigins = ['https://frontend-a.com', 'https://frontend-b.com']
const origin = req.headers.origin
 
if (allowedOrigins.includes(origin)) {
  res.setHeader('Access-Control-Allow-Origin', origin)
  res.setHeader('Access-Control-Allow-Credentials', 'true') // 允许前端带 cookie
  res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS')
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
}
 
// 设置 Cookie(HttpOnly + Secure)
res.setHeader('Set-Cookie', `auth_token=xxx; HttpOnly; Secure; SameSite=None; Path=/`)

⚠️ 跨域 + Cookie 必须使用:

  • Access-Control-Allow-Origin: <具体域名>
  • Access-Control-Allow-Credentials: true
  • Cookie 设置为 HttpOnly; Secure; SameSite=None

🧠 四、前端用户状态管理方案

✅ 使用 React Context 存储用户信息(避免 localStorage)

// auth-context.tsx
const AuthContext = createContext({ user: null, setUser: () => {} })
 
export const AuthProvider = ({ children }) => {
  const [user, setUser] = useState(null)
 
  useEffect(() => {
    fetch('https://api.example.com/api/auth/me', {
      credentials: 'include',
    })
      .then((res) => res.json())
      .then((data) => {
        if (data.success) setUser(data.user)
      })
  }, [])
 
  return (
    <AuthContext.Provider value={{ user, setUser }}>
      {children}
    </AuthContext.Provider>
  )
}
  • 优点:
    • 数据保存在内存中,安全(避免 XSS 读 localStorage)
    • 全局可访问
    • 页面刷新自动重拉用户信息

🔐 五、Cookie 鉴权机制

属性说明
HttpOnlyJS 无法访问,防 XSS
Secure仅 HTTPS 下传输
SameSite=None跨站点请求时允许携带 Cookie(必须为 None)
Path=/全站点有效

例如:

Set-Cookie: auth_token=xxx; HttpOnly; Secure; SameSite=None; Path=/

🧪 六、完整登录流程总结

1. 用户点击登录 → 跳转至 SSO 登录页面
2. 登录成功 → SSO 重定向回前端页面,带上 session-token
3. 前端读取 session-token → 请求后端 /validate-session
4. 后端验证 token → 设置认证 Cookie(HttpOnly)
5. 前端拉取用户信息 /api/auth/me → 存入 Context(内存)
6. 后续所有请求自动携带 Cookie,完成鉴权
7. 页面刷新 → 继续读取 Cookie + 拉取用户信息

🧰 七、安全最佳实践总结

项目建议做法
Token 存储不存 localStorage,全部放在 Cookie(HttpOnly)
Cookie 设置HttpOnly; Secure; SameSite=None
前端状态存储使用 React Context,存储在内存
前端请求设置credentials: 'include'
后端 CORS 设置动态设置 Access-Control-Allow-Origin,不能是 *
CSRF 防护(可选)对敏感接口增加 CSRF Token 校验
页面路由保护使用 AuthProvider + PrivateRoute 控制访问
HTTPS前后端都使用 HTTPS

✅ 附加建议(可选扩展)

  • 使用 React Router + ProtectedRoute 实现路由级权限控制
  • 使用 Redux Toolkit 或 Zustand 管理状态(替代 Context)
  • 实现 Token 刷新机制(如果 Cookie 过期)
  • 添加 WebSocket 鉴权支持(如有实时通信需求)