* 刷新 Token * 尝试从多个来源获取 refresh_token
()
| 162 | * 尝试从多个来源获取 refresh_token |
| 163 | */ |
| 164 | async function refreshToken(): Promise<RefreshTokenResponse> { |
| 165 | console.log('[refreshToken] 调用刷新接口'); |
| 166 | |
| 167 | // 尝试从多个来源获取 refresh_token |
| 168 | let refreshTokenValue = null; |
| 169 | |
| 170 | // 1. 尝试从 localStorage 读取 |
| 171 | if (typeof window !== 'undefined') { |
| 172 | refreshTokenValue = localStorage.getItem('refresh_token'); |
| 173 | if (refreshTokenValue) { |
| 174 | console.log('[refreshToken] 从 localStorage 获取到 refresh_token'); |
| 175 | } |
| 176 | } |
| 177 | |
| 178 | // 2. 如果 localStorage 没有,尝试从非 httpOnly cookie 读取 |
| 179 | if (!refreshTokenValue && typeof document !== 'undefined') { |
| 180 | const cookies = document.cookie.split(';'); |
| 181 | for (const cookie of cookies) { |
| 182 | const [name, value] = cookie.trim().split('='); |
| 183 | if (name === 'refresh_token') { |
| 184 | refreshTokenValue = value; |
| 185 | console.log('[refreshToken] 从 cookie 获取到 refresh_token'); |
| 186 | break; |
| 187 | } |
| 188 | } |
| 189 | } |
| 190 | |
| 191 | if (!refreshTokenValue) { |
| 192 | console.error('[refreshToken] 无法获取 refresh_token'); |
| 193 | throw new Error('No refresh token available'); |
| 194 | } |
| 195 | |
| 196 | const response = await fetch(`${API_BASE_URL}/api/auth/refresh`, { |
| 197 | method: 'POST', |
| 198 | headers: { |
| 199 | 'Content-Type': 'application/json', |
| 200 | }, |
| 201 | credentials: 'include', // 发送 cookies(以防后端也支持从 cookie 读取) |
| 202 | body: JSON.stringify({ refresh_token: refreshTokenValue }), |
| 203 | }); |
| 204 | |
| 205 | if (!response.ok) { |
| 206 | const error = await response.json().catch(() => ({ detail: 'Token refresh failed' })); |
| 207 | console.error('[refreshToken] 刷新失败:', error); |
| 208 | throw new Error('Token refresh failed'); |
| 209 | } |
| 210 | |
| 211 | const data = await response.json(); |
| 212 | console.log('[refreshToken] 刷新成功'); |
| 213 | return data; |
| 214 | } |
| 215 | |
| 216 | /** |
| 217 | * 带自动刷新的 fetch 请求 |
no outgoing calls
no test coverage detected