61 lines
2.4 KiB
JavaScript
61 lines
2.4 KiB
JavaScript
import { API_ROOT } from '../config/runtime.js'
|
|
|
|
const pendingRefreshes = new Map()
|
|
|
|
function authRequest(path, data, accessToken = '') {
|
|
return new Promise((resolve, reject) => {
|
|
const url = `${API_ROOT}${path}`
|
|
console.info('[Overseas PDA auth] request', { method: 'POST', url })
|
|
uni.request({
|
|
url,
|
|
method: 'POST',
|
|
data,
|
|
header: { Accept: 'application/json', 'Content-Type': 'application/json',
|
|
...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}) },
|
|
success(response) {
|
|
const body = response.data || {}
|
|
console.info('[Overseas PDA auth] response', { url, statusCode: response.statusCode, code: body.code,
|
|
message: typeof body === 'object' ? body.message : String(body).slice(0, 160),
|
|
contentType: response.header?.['Content-Type'] || response.header?.['content-type'],
|
|
requestId: body.requestId || response.header?.['X-Request-Id'] || response.header?.['x-request-id'],
|
|
traceId: body.traceId || response.header?.['X-Trace-Id'] || response.header?.['x-trace-id'] })
|
|
if (response.statusCode !== 200 || String(body.code) !== '200') {
|
|
const error = new Error(body.message || '认证服务请求失败')
|
|
error.code = body.code || response.statusCode
|
|
error.statusCode = response.statusCode
|
|
error.requestId = body.requestId || response.header?.['X-Request-Id'] || response.header?.['x-request-id']
|
|
error.traceId = body.traceId || response.header?.['X-Trace-Id'] || response.header?.['x-trace-id']
|
|
reject(error)
|
|
return
|
|
}
|
|
resolve(body.data)
|
|
},
|
|
fail(error) {
|
|
console.error('[Overseas PDA auth] network failure', { url, errMsg: error.errMsg || 'unknown' })
|
|
const next = new Error(error.errMsg || '网络连接失败')
|
|
next.network = true
|
|
reject(next)
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
export function login(loginId, password) {
|
|
return authRequest('/auth/login', { loginId, password })
|
|
}
|
|
|
|
export function refresh(refreshToken) {
|
|
if (pendingRefreshes.has(refreshToken)) return pendingRefreshes.get(refreshToken)
|
|
const pending = authRequest('/auth/refresh', { refreshToken }).finally(() => {
|
|
if (pendingRefreshes.get(refreshToken) === pending) pendingRefreshes.delete(refreshToken)
|
|
})
|
|
pendingRefreshes.set(refreshToken, pending)
|
|
return pending
|
|
}
|
|
|
|
export function getPendingRefresh(refreshToken) { return pendingRefreshes.get(refreshToken) || null }
|
|
|
|
export function logout(accessToken, refreshToken) {
|
|
return authRequest('/auth/logout', { refreshToken }, accessToken)
|
|
}
|