电网接口插件项目的token认证原理
电网接口插件项目的token认证原理
¶一、技术实现原理与流程
¶1. Token 认证基本原理
Token 认证是一种无状态的身份验证机制,主要流程如下:
- 用户登录:用户提供凭证(用户名/密码)进行身份验证
- Token 生成:服务端验证成功后,生成包含用户信息的 token
- Token 存储:将 token 存储在缓存系统中(内存或 Redis)
- Token 返回:将 token 返回给客户端
- 后续请求:客户端在后续请求中携带 token
- Token 验证:服务端验证 token 的有效性和权限
¶2. gftoken 组件工作原理
gftoken 是一个基于 GoFrame 框架的 token 认证组件,其核心工作原理:
-
Token 生成:
- 使用用户 ID 和时间戳等信息构造 token 数据
- 使用配置的加密密钥对数据进行加密
- 生成的 token 为 Base64 编码的字符串
-
Token 存储:
- 根据配置的缓存适配器(内存/Redis)存储 token
- 存储的键名格式为:
{缓存前缀} + {token标识符} - 设置 token 的过期时间
-
Token 验证流程:
- 从请求头中提取 Authorization 字段的 token
- 解密 token 获取用户信息
- 在缓存中查找对应的 token 记录
- 验证 token 是否有效(未过期、未被撤销)
¶3. 多系统共享 Token 的技术实现
当两个独立系统需要共享 token 时,关键在于:
-
共享存储:
- 两个系统必须使用相同的 Redis 实例
- Redis 配置(地址、端口、数据库编号)必须一致
-
一致的缓存键:
- 缓存前缀必须完全一致
- token 的标识符生成规则必须一致
-
相同的加密机制:
- 加密密钥必须完全一致
- 加密算法必须相同
¶二、代码示例(使用占位符替代敏感信息)
¶1. 配置文件示例
系统 A 的配置文件 (config.yaml):
1 | # 缓存配置 |
系统 B 的配置文件 (config.yaml):
1 | # 缓存配置 - 与系统 A 保持一致 |
¶2. 系统 A 中的 Token 生成代码
1 | package system |
¶3. 系统 B 中的 Token 验证代码
1 | package router |
¶三、两个系统间 Token 共享的关键配置点
要实现两个系统间的 token 共享,必须确保以下配置点完全一致:
-
Redis 连接配置:
1
2
3
4redis:
default:
address: "redis://example_host:6379" # 地址必须一致
db: 0 # 数据库编号必须一致 -
缓存前缀:
1
2cache:
prefix: "example_prefix:" # 前缀必须完全一致 -
加密密钥:
1
2gfToken:
encryptKey: "your_32_byte_encrypt_key_example" # 密钥必须完全一致 -
Token 格式:两个系统必须使用相同的 token 格式和解析方式
¶四、密钥更新的安全最佳实践
-
定期轮换密钥:
- 建议每 90 天更换一次加密密钥
- 更新流程应自动化,减少人为错误
-
密钥更新步骤:
1
2
3
4
5
61. 生成新密钥
2. 更新系统 A 的配置
3. 重启系统 A
4. 使所有现有 token 失效(可选)
5. 更新系统 B 的配置
6. 重启系统 B -
密钥管理:
- 使用密钥管理系统存储密钥,而非硬编码
- 配置文件中的密钥应加密或使用环境变量
-
无缝过渡策略:
- 实现双密钥支持,允许新旧密钥共存一段时间
- 代码示例:
1
2
3
4
5
6
7
8
9// 支持新旧两种密钥的验证
func verifyToken(token string) bool {
// 先尝试用新密钥验证
if verifyWithKey(token, newEncryptKey) {
return true
}
// 如果失败,尝试用旧密钥验证
return verifyWithKey(token, oldEncryptKey)
} -
监控与审计:
- 记录所有密钥更改操作
- 监控密钥使用情况和异常访问
通过以上实现原理和代码示例,可以成功实现两个系统间的 token 共享认证,确保用户只需在一个系统登录,即可访问另一个系统的受保护资源。