2026-09-09 22:05:00 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 认证服务(规范 §131 services 层 / API_INVENTORY 认证域)
|
|
|
|
|
|
*
|
|
|
|
|
|
* 仅封装 auth/wechat/login、auth/phone/bind、auth/refresh、auth/logout 四个端点。
|
|
|
|
|
|
* Token 持久化、Session 失效回调由 utils/api.js 统一处理;本层不读写本地存储。
|
|
|
|
|
|
* 刷新 Token 在 401 自动重试由 AuthStore 协调(单飞锁),见 stores/authStore。
|
|
|
|
|
|
*/
|
|
|
|
|
|
const api = require('../utils/api');
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 微信登录(API_INVENTORY 行 8)
|
|
|
|
|
|
* @param {{ code: string }} payload wx.login 拿到的 code
|
2026-09-22 21:41:30 +08:00
|
|
|
|
* @returns {Promise<{ accessToken: string, refreshToken: string, expiresIn: number,
|
|
|
|
|
|
* userId: string, isNewUser: boolean }>}
|
|
|
|
|
|
* 注意是 accessToken(不是 token)、isNewUser(不是 needPhone/needProfile)——
|
|
|
|
|
|
* 这两处字段名此前都写错,导致 token 落空与「误判已绑手机号」,见 authStore。
|
2026-09-09 22:05:00 +08:00
|
|
|
|
*/
|
|
|
|
|
|
function wechatLogin(payload) {
|
|
|
|
|
|
return api.post('/auth/wechat/login', payload, undefined, payload.code);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 绑定手机号(API_INVENTORY 行 9)
|
|
|
|
|
|
* @param {{ phoneCode: string }} payload wx.getPhoneNumber 拿到的 encryptedData/iv 或 phoneCode
|
|
|
|
|
|
* @returns {Promise<{ bound: true }>}
|
|
|
|
|
|
*/
|
|
|
|
|
|
function bindPhone(payload) {
|
|
|
|
|
|
return api.post('/auth/phone/bind', payload, undefined, payload.phoneCode || payload.encryptedData);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 刷新 Token(API_INVENTORY 行 10)
|
2026-09-22 21:41:30 +08:00
|
|
|
|
* 后端 /auth/refresh 只强制要求 refreshToken(userId 由令牌 subject 自证身份);
|
|
|
|
|
|
* 这里仍传 userId,让后端校验它与令牌主体一致 —— 串号时能被提前拦下。
|
2026-09-22 19:08:16 +08:00
|
|
|
|
* @param {string} userId 当前登录用户 ID(来自 AuthStore.state.userId)
|
|
|
|
|
|
* @returns {Promise<{ accessToken: string, refreshToken: string, expiresIn: number }>}
|
2026-09-09 22:05:00 +08:00
|
|
|
|
*/
|
2026-09-22 19:08:16 +08:00
|
|
|
|
function refresh(userId) {
|
2026-09-09 22:05:00 +08:00
|
|
|
|
const refreshToken = api.getRefreshToken();
|
2026-09-22 19:08:16 +08:00
|
|
|
|
return api.post('/auth/refresh', { userId, refreshToken });
|
2026-09-09 22:05:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 登出(API_INVENTORY 行 11)
|
2026-09-18 16:37:33 +08:00
|
|
|
|
* 幂等:键由 api 层托管,网络异常重试时复用同一把,避免后端重复记账。
|
2026-09-09 22:05:00 +08:00
|
|
|
|
* @returns {Promise<void>}
|
|
|
|
|
|
*/
|
|
|
|
|
|
function logout() {
|
2026-09-18 16:37:33 +08:00
|
|
|
|
return api.post('/auth/logout', {}, undefined, api.idempotencyKey('logout'));
|
2026-09-09 22:05:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
|
|
wechatLogin,
|
|
|
|
|
|
bindPhone,
|
|
|
|
|
|
refresh,
|
|
|
|
|
|
logout,
|
|
|
|
|
|
};
|