单点登录知识梳理--鸿蒙OS

139 阅读2分钟

1. 核心流程与协议选择

  • 协议:基于 OAuth 2.0 + OpenID Connect(主流方案,兼容移动/Web端)。

  • 流程

    1. 用户访问应用A,未登录则跳转至统一认证中心
    2. 认证中心验证用户身份(密码、短信、第三方登录等)。
    3. 认证中心生成 JWT(含用户ID、权限、有效期)  并返回给应用A。
    4. 应用A携带JWT访问其他应用(B/C),通过认证中心验签实现无感登录。

2. 认证中心架构设计

plaintext

复制

                +-------------------+  
                |   认证中心服务     |  
                +-------------------+  
                | - 用户身份验证     |  
                | - Token生成/验证  |  
                | - 会话管理         |  
                +---------+---------+  
                          ↑  HTTPS  
+------------+     +------+------+     +------------+  
|  客户端App  +----->  网关/API   +----->  业务系统   |  
+------------+     +------------+     +------------+  
  • 关键模块

    • 身份验证:支持多因子认证(如华为账号、短信、人脸)。
    • 令牌服务:生成/刷新JWT,使用 非对称加密(RSA)  签名防篡改。
    • 会话存储:Redis集群存储活跃会话(Key: user:token, Value: 用户权限+元数据)。

3. 鸿蒙生态适配优化

  • 分布式身份同步

    • 利用鸿蒙 分布式数据管理,将登录状态通过DistributedDataObject同步至同账号设备。

    typescript

    复制

    // 同步登录状态到其他设备
    let ssoStatus = new distributedDataObject.create({
      isLoggedIn: true,
      token: 'xxx'
    });
    ssoStatus.on('change', (fields) => {
      // 监听其他设备状态变化
    });
    
  • 安全增强

    • TEE(可信执行环境)  存储私钥,防止JWT签名密钥泄露。
    • 生物认证集成:调用@ohos.userIAM.userAuth实现人脸/指纹快捷登录。

4. JWT生成与验证示例

typescript

复制

// 认证中心生成JWT(Node.js示例)
import jwt from 'jsonwebtoken';
const privateKey = '-----BEGIN PRIVATE KEY-----...';
const token = jwt.sign(
  { userId: '123', role: 'user' },
  privateKey,
  { algorithm: 'RS256', expiresIn: '2h' }
);

// 业务系统验证JWT(鸿蒙端)
import jwt from 'jsonwebtoken';
const publicKey = '-----BEGIN PUBLIC KEY-----...';
try {
  const decoded = jwt.verify(token, publicKey, { algorithms: ['RS256'] });
  // 验证通过,授权访问
} catch (err) {
  // Token失效或篡改
}

5. 单点注销(Single Logout)

  • 实现方式

    1. 用户从应用A发起注销,通知认证中心。
    2. 认证中心清除Redis中的会话数据,广播注销事件至所有关联应用。
    3. 应用收到事件后清理本地Token(通过 EventHub 或 WebSocket)。

    typescript

    复制

    // 鸿蒙应用监听注销事件
    eventHub.on('global_logout', (userId) => {
      if (currentUser === userId) {
        clearLocalToken();
      }
    });
    

6. 安全性设计

  • 防御措施

    • HTTPS:全流程加密,防止中间人攻击。
    • Token绑定:JWT与客户端IP/设备指纹绑定,防止盗用。
    • 短有效期:Access Token有效期≤2小时,Refresh Token≤7天。
  • 鸿蒙安全API

    typescript

    复制

    // 使用系统加密库存储敏感数据
    import security from '@ohos.security';
    let cipher = security.crypto.createCipher(security.crypto.AES | security.crypto.ECB, 'key');
    let encrypted = cipher.encrypt('token');
    

7. 性能优化

  • 缓存策略

    • 业务系统本地缓存JWT验签结果(缓存时间<Token有效期)。
  • 无状态设计

    • 认证中心不存储会话,依赖JWT自包含信息,横向扩展更容易。