Files
mini-programs/src/utils/tokenManager.ts
2026-02-14 12:59:21 +08:00

113 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.warn('获取访问令牌失败:', error)
return null
}
}
// 获取刷新令牌
getRefreshToken(): string | null {
try {
return Taro.getStorageSync(REFRESH_TOKEN_KEY)
} catch (error) {
console.warn('获取刷新令牌失败:', error)
return null
}
}
// 获取令牌过期时间
getTokenExpires(): number | null {
try {
return Taro.getStorageSync(TOKEN_EXPIRES_KEY)
} catch (error) {
console.warn('获取令牌过期时间失败:', 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.warn('设置令牌失败:', error)
}
}
// 清除所有令牌
clearTokens(): void {
try {
Taro.removeStorageSync(TOKEN_KEY)
Taro.removeStorageSync(REFRESH_TOKEN_KEY)
Taro.removeStorageSync(TOKEN_EXPIRES_KEY)
} catch (error) {
console.warn('清除令牌失败:', 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()
}
// 获取令牌剩余有效时间(毫秒)
getTokenRemainingTime(): number {
const expiresAt = this.getTokenExpires()
if (!expiresAt) {
return 0 // 如果没有过期时间返回0
}
const remaining = expiresAt - Date.now()
return remaining > 0 ? remaining : 0
}
// 获取Authorization头
getAuthHeader(): Record<string, string> {
const token = this.getAccessToken()
if (!token) {
return {}
}
return {
'applet-token': `${token}`
}
}
}
// 导出单例实例
export default new TokenManager()