1. 核心流程与协议选择
-
协议:基于 OAuth 2.0 + OpenID Connect(主流方案,兼容移动/Web端)。
-
流程:
- 用户访问应用A,未登录则跳转至统一认证中心。
- 认证中心验证用户身份(密码、短信、第三方登录等)。
- 认证中心生成 JWT(含用户ID、权限、有效期) 并返回给应用A。
- 应用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)
-
实现方式:
- 用户从应用A发起注销,通知认证中心。
- 认证中心清除Redis中的会话数据,广播注销事件至所有关联应用。
- 应用收到事件后清理本地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自包含信息,横向扩展更容易。