
- 注释掉Podfile中的Alamofire依赖,更新Podfile.lock以反映更改。 - 在yana/APIs/API-README.md中新增自动认证Header机制的详细文档,描述其工作原理、实现细节及最佳实践。 - 在yana/yanaApp.swift中将print语句替换为debugInfo以增强调试信息的输出。 - 在API相关文件中实现用户认证状态检查和相关header的自动添加逻辑,提升API请求的安全性和用户体验。 - 更新多个文件中的日志输出,确保在DEBUG模式下提供详细的调试信息。
3.9 KiB
3.9 KiB
🔐 自动认证 Header 机制
概述
系统会自动检查用户的登录状态,并在所有API请求中自动添加认证相关的header。
工作原理
- 检查认证状态:每次发起API请求时,系统会检查
AccountModel
的有效性 - 自动添加Header:如果用户已登录且认证信息有效,自动添加以下header:
pub_uid
: 用户唯一标识(来自AccountModel.uid
)pub_ticket
: 业务会话票据(来自AccountModel.ticket
)
实现细节
// 在 APIConfiguration.defaultHeaders 中实现
static var defaultHeaders: [String: String] {
var headers = [
"Content-Type": "application/json",
"Accept": "application/json",
// ... 其他基础header
]
// 检查用户认证状态并添加相关 headers
let authStatus = UserInfoManager.checkAuthenticationStatus()
if authStatus.canAutoLogin {
// 添加认证 headers(仅在 AccountModel 有效时)
if let userId = UserInfoManager.getCurrentUserId() {
headers["pub_uid"] = userId
}
if let userTicket = UserInfoManager.getCurrentUserTicket() {
headers["pub_ticket"] = userTicket
}
}
return headers
}
认证状态检查
系统使用UserInfoManager.checkAuthenticationStatus()
检查认证状态:
enum AuthenticationStatus {
case valid // 认证有效,可以自动登录
case invalid // 认证信息不完整或无效
case notFound // 未找到认证信息
}
认证有效的条件:
AccountModel
存在uid
不为空ticket
不为空accessToken
不为空
使用方式
认证header的添加是完全自动的,开发者无需手动处理:
// 示例:发起API请求
let request = ConfigRequest()
let response = try await apiService.request(request)
// 如果用户已登录,以上请求会自动包含:
// Header: pub_uid = "12345"
// Header: pub_ticket = "eyJhbGciOiJIUzI1NiJ9..."
测试功能
在DEBUG模式下,可以使用测试方法验证功能:
#if DEBUG
// 运行认证header测试
UserInfoManager.testAuthenticationHeaders()
#endif
测试包括:
- 未登录状态测试:验证不会添加认证header
- 已登录状态测试:验证正确添加认证header
- 清理测试:验证测试数据正确清理
调试日志
在DEBUG模式下,系统会输出认证header的添加情况:
🔐 添加认证 header: pub_uid = 12345
🔐 添加认证 header: pub_ticket = eyJhbGciOiJIUzI1NiJ9...
或者:
🔐 跳过认证 header 添加 - 认证状态: 未找到认证信息
最佳实践
- 登录成功后保存完整认证信息:
UserInfoManager.saveCompleteAuthenticationData(
accessToken: loginResponse.accessToken,
ticket: ticketResponse.ticket,
uid: loginResponse.uid,
userInfo: loginResponse.userInfo
)
- 登出时清理认证信息:
UserInfoManager.clearAllAuthenticationData()
- 应用启动时检查认证状态:
let authStatus = UserInfoManager.checkAuthenticationStatus()
if authStatus.canAutoLogin {
// 可以直接进入主界面
} else {
// 需要重新登录
}
安全考虑
- 内存安全:ticket存储在内存中,应用重启需重新获取
- 持久化安全:uid和accessToken存储在Keychain中,确保安全性
- 自动清理:认证失效时系统会自动停止添加认证header
故障排除
-
认证header未添加:
- 检查用户是否已正确登录
- 验证AccountModel是否包含有效的uid和ticket
- 确认认证状态为valid
-
ticket为空:
- 检查登录流程是否正确获取了ticket
- 验证ticket是否正确保存到AccountModel
-
调试模式下查看详细日志:
- 启用DEBUG模式查看认证header添加日志
- 使用测试方法验证功能正确性