113 lines
2.6 KiB
TypeScript
113 lines
2.6 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.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()
|