102 lines
2.3 KiB
TypeScript
102 lines
2.3 KiB
TypeScript
import Taro from '@tarojs/taro'
|
|
|
|
const TOKEN_KEY = 'access_token'
|
|
const REFRESH_TOKEN_KEY = 'refresh_token'
|
|
const TOKEN_EXPIRES_KEY = 'token_expires'
|
|
|
|
export interface TokenInfo {
|
|
accessToken: string
|
|
refreshToken?: string
|
|
expiresAt?: number
|
|
}
|
|
|
|
class TokenManager {
|
|
// 获取访问令牌
|
|
getAccessToken(): string | null {
|
|
try {
|
|
return Taro.getStorageSync(TOKEN_KEY)
|
|
} catch (error) {
|
|
console.error('获取访问令牌失败:', error)
|
|
return null
|
|
}
|
|
}
|
|
|
|
// 获取刷新令牌
|
|
getRefreshToken(): string | null {
|
|
try {
|
|
return Taro.getStorageSync(REFRESH_TOKEN_KEY)
|
|
} catch (error) {
|
|
console.error('获取刷新令牌失败:', error)
|
|
return null
|
|
}
|
|
}
|
|
|
|
// 获取令牌过期时间
|
|
getTokenExpires(): number | null {
|
|
try {
|
|
return Taro.getStorageSync(TOKEN_EXPIRES_KEY)
|
|
} catch (error) {
|
|
console.error('获取令牌过期时间失败:', error)
|
|
return null
|
|
}
|
|
}
|
|
|
|
// 设置令牌信息
|
|
setToken(tokenInfo: TokenInfo): void {
|
|
try {
|
|
Taro.setStorageSync(TOKEN_KEY, tokenInfo.accessToken)
|
|
|
|
if (tokenInfo.refreshToken) {
|
|
Taro.setStorageSync(REFRESH_TOKEN_KEY, tokenInfo.refreshToken)
|
|
}
|
|
|
|
if (tokenInfo.expiresAt) {
|
|
Taro.setStorageSync(TOKEN_EXPIRES_KEY, tokenInfo.expiresAt)
|
|
}
|
|
} catch (error) {
|
|
console.error('设置令牌失败:', error)
|
|
}
|
|
}
|
|
|
|
// 清除所有令牌
|
|
clearTokens(): void {
|
|
try {
|
|
Taro.removeStorageSync(TOKEN_KEY)
|
|
Taro.removeStorageSync(REFRESH_TOKEN_KEY)
|
|
Taro.removeStorageSync(TOKEN_EXPIRES_KEY)
|
|
} catch (error) {
|
|
console.error('清除令牌失败:', error)
|
|
}
|
|
}
|
|
|
|
// 检查令牌是否过期
|
|
isTokenExpired(): boolean {
|
|
const expiresAt = this.getTokenExpires()
|
|
if (!expiresAt) {
|
|
return false // 如果没有过期时间,假设未过期
|
|
}
|
|
|
|
return Date.now() >= expiresAt
|
|
}
|
|
|
|
// 检查是否有有效令牌
|
|
hasValidToken(): boolean {
|
|
const token = this.getAccessToken()
|
|
return !!token && !this.isTokenExpired()
|
|
}
|
|
|
|
// 获取Authorization头
|
|
getAuthHeader(): Record<string, string> {
|
|
const token = this.getAccessToken()
|
|
if (!token) {
|
|
return {}
|
|
}
|
|
|
|
return {
|
|
'Authorization': `Bearer ${token}`
|
|
}
|
|
}
|
|
}
|
|
|
|
// 导出单例实例
|
|
export default new TokenManager()
|