跨系统身份验证实施指南

跨系统身份验证实施指南

第一部分:身份验证提供者系统(认证服务器)

作为认证中心,为其他系统提供统一登录服务并颁发安全令牌的核心系统。

系统流程



graph TD
    A[接收登录请求] --> B{是否有重定向参数?}
    B -->|是| C[存储重定向URL]
    B -->|否| D[使用默认重定向]

    C --> E[显示登录页面]
    D --> E

    E --> F[用户提交凭据]
    F --> G[后端验证]

    G --> H{有效?}
    H -->|否| I[显示错误]
    I --> E

    H -->|是| J[生成/存储令牌]
    J --> K{重定向URL存在?}

    K -->|是| L{是外部链接?}
    K -->|否| M[导航到仪表板]

    L -->|是| N[将令牌附加到URL]
    L -->|否| O[内部导航]

    N --> P[window.location.href重定向]
    O --> Q[router.push重定向]
    M --> R[结束]
    P --> R
    Q --> R

核心组件

1. 登录页面组件

  • 解析并存储URL查询参数中的重定向地址
  • 处理用户登录表单提交
  • 成功身份验证后执行以下操作:
    • 检索已存储的重定向URL
    • 判断重定向目标是内部页面还是外部系统
    • 携带令牌执行相应的重定向操作

2. 重定向工具模块

1
2
3
4
5
核心函数:
- parseRedirectUrl(): 从URL中解析重定向参数
- isExternalUrl(): 判断URL是否指向外部系统
- buildAuthenticatedUrl(): 将认证令牌附加到重定向URL
- performRedirect(): 执行页面重定向操作

3. 路由守卫

1
2
3
4
5
6
7
router.beforeEach 逻辑:
- 用户已认证且存在重定向参数时:
- 跳过登录页面显示
- 直接使用现有令牌执行重定向
- 用户未认证时:
- 允许正常访问登录页面
- 保持重定向参数不变

4. 令牌管理模块

  • 用户成功登录后安全存储认证令牌
  • 为重定向逻辑提供令牌获取接口
  • 处理令牌持久化存储(支持localStorage、sessionStorage、cookie等方式)

实施时序图



sequenceDiagram
    participant URL as 浏览器URL
    participant Login as 登录页面
    participant Auth as 认证服务
    participant Store as 令牌存储
    participant Redirect as 重定向处理器

    URL->>Login: 加载 ?redirect=targetUrl
    Login->>Login: 解析并存储重定向参数
    Login->>Auth: 提交凭据
    Auth->>Store: 保存令牌
    Auth->>Login: 返回成功
    Login->>Redirect: 使用存储的URL调用
    Redirect->>Redirect: 检查是否为外部链接
    Redirect->>Redirect: 使用令牌构建URL
    Redirect->>URL: 执行重定向


第二部分:客户端系统(接入认证的业务系统)

依赖认证提供者完成用户身份验证的业务应用系统。

系统流程



graph TD
    A[用户访问受保护路由] --> B{有有效令牌?}
    B -->|是| C[允许访问]
    B -->|否| D[构建认证提供者URL]

    D --> E[将当前URL编码为重定向参数]
    E --> F[重定向到认证提供者]

    F --> G[用户在认证提供者完成登录]
    G --> H[带令牌重定向回来]

    H --> I{URL中有令牌?}
    I -->|是| J[提取令牌]
    I -->|否| K[再次重定向到登录]

    J --> L[验证令牌]
    L --> M{有效?}
    M -->|是| N[本地存储令牌]
    M -->|否| K

    N --> O[从URL移除令牌]
    O --> P[继续到请求的页面]

    C --> Q[结束]
    P --> Q
    K --> Q

核心组件

1. 路由保护机制

1
2
3
4
5
6
7
8
9
10
11
router.beforeEach 守卫逻辑:
- 检查当前路由是否需要身份验证
- 验证用户现有令牌的有效性
- 无有效令牌时的处理:
- 将当前URL作为重定向参数构建认证提供者链接
- 跳转到认证提供者进行登录
- 从认证提供者返回时的处理:
- 从URL参数中提取认证令牌
- 将令牌存储到本地
- 清理URL中的敏感参数
- 继续用户原始导航请求

2. 令牌处理器模块

1
2
3
4
5
6
核心函数:
- extractTokenFromUrl(): 从URL查询参数中提取令牌
- validateToken(): 验证令牌格式和有效性
- storeToken(): 将令牌安全存储到本地
- cleanUrlParams(): 从浏览器URL中清除令牌参数
- hasValidToken(): 检查用户当前认证状态

3. 身份验证服务模块

  • 构建认证提供者的重定向URL链接
  • 处理令牌验证和刷新逻辑
  • 管理用户会话状态
  • 处理用户登出操作(清除本地令牌并重定向到登录页)

4. API请求拦截器

  • 自动将认证令牌附加到API请求头
  • 处理401未授权响应
  • 令牌失效时自动触发重新认证流程

认证返回流程处理



sequenceDiagram
    participant Browser as 浏览器
    participant Router as 路由守卫
    participant Token as 令牌处理器
    participant Storage as 本地存储
    participant Page as 受保护页面

    Browser->>Router: 从认证返回 ?token=xxx
    Router->>Token: 从URL提取令牌
    Token->>Token: 验证令牌格式
    Token->>Storage: 存储令牌
    Token->>Browser: 清理URL(移除令牌参数)
    Router->>Page: 允许访问受保护路由


系统间集成要点

认证提供者系统职责

  1. 参数接收:接受并解析来自客户端的重定向参数
  2. 身份验证:验证用户提供的登录凭据
  3. 令牌生成:生成安全的认证令牌
  4. URL构建:将令牌安全地附加到重定向URL
  5. 跨域重定向:执行安全的跨系统重定向操作

客户端系统职责

  1. 访问检测:识别并拦截未认证的受保护资源访问
  2. 重定向构建:构建包含返回地址的认证提供者URL
  3. 返回处理:处理来自认证提供者的回调请求
  4. 令牌管理:提取、验证并安全存储认证令牌
  5. 会话维护:维护用户的登录状态和会话信息

安全考虑要点

  • URL白名单:严格验证重定向目标URL,防止开放重定向攻击
  • HTTPS强制:所有认证相关的重定向必须使用HTTPS协议
  • 令牌生命周期:实现合理的令牌过期机制
  • 敏感数据清理:及时清理URL中的令牌等敏感信息
  • 令牌刷新:实现安全的令牌自动刷新机制