HaniBlindBox/honey_box/common/server/auth.js

227 lines
6.3 KiB
JavaScript
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 RequestManager from '../request';
/**
* 保存登录Token到本地存储
* 支持新版双Token格式和旧版单Token格式
* @param {Object|String} data 登录响应数据
* @param {String} data.accessToken 访问令牌(新版)
* @param {String} data.refreshToken 刷新令牌(新版)
* @param {Number} data.expiresIn 过期时间(秒)(新版)
*/
export const saveLoginTokens = (data) => {
if (typeof data === 'string') {
// 旧版格式直接返回token字符串
uni.setStorageSync('token', data);
} else if (data && typeof data === 'object') {
// 新版格式返回包含accessToken、refreshToken、expiresIn的对象
if (data.accessToken) {
uni.setStorageSync('token', data.accessToken);
uni.setStorageSync('accessToken', data.accessToken);
}
if (data.refreshToken) {
uni.setStorageSync('refreshToken', data.refreshToken);
}
if (data.expiresIn) {
// 计算过期时间戳(当前时间 + expiresIn秒
const tokenExpireTime = Date.now() + (data.expiresIn * 1000);
uni.setStorageSync('tokenExpireTime', tokenExpireTime);
}
// 兼容旧版如果响应中有token字段向后兼容
if (data.token && !data.accessToken) {
uni.setStorageSync('token', data.token);
}
}
};
/**
* 清除所有登录Token
*/
export const clearLoginTokens = () => {
uni.removeStorageSync('token');
uni.removeStorageSync('accessToken');
uni.removeStorageSync('refreshToken');
uni.removeStorageSync('tokenExpireTime');
uni.removeStorageSync('userinfo');
};
/**
* 获取当前存储的Token信息
* @returns {Object} Token信息对象
*/
export const getStoredTokens = () => {
return {
token: uni.getStorageSync('token'),
accessToken: uni.getStorageSync('accessToken'),
refreshToken: uni.getStorageSync('refreshToken'),
tokenExpireTime: uni.getStorageSync('tokenExpireTime')
};
};
/**
* 检查Access Token是否即将过期提前5分钟
* @returns {Boolean} 是否即将过期
*/
export const isTokenExpiringSoon = () => {
const tokenExpireTime = uni.getStorageSync('tokenExpireTime');
if (!tokenExpireTime) {
return false;
}
// 提前5分钟300秒认为即将过期
const bufferTime = 5 * 60 * 1000;
return Date.now() >= (tokenExpireTime - bufferTime);
};
/**
* 检查Access Token是否已过期
* @returns {Boolean} 是否已过期
*/
export const isTokenExpired = () => {
const tokenExpireTime = uni.getStorageSync('tokenExpireTime');
if (!tokenExpireTime) {
return false;
}
return Date.now() >= tokenExpireTime;
};
/**
* 微信手机号快速验证登录
* @param {String} phoneCode 微信手机号授权codegetPhoneNumber返回
* @param {String} pid 推荐人ID
* @returns {Promise} 登录结果
*/
export const wxPhoneLogin = async (phoneCode, pid = '') => {
// 先获取微信登录code用于获取openid
const loginRes = await new Promise((resolve, reject) => {
uni.login({
provider: 'weixin',
success: resolve,
fail: reject
});
});
return await RequestManager.post('/wxPhoneLogin', {
phoneCode,
loginCode: loginRes.code,
pid
});
};
/**
* 微信登录
* @param {Object} params 登录参数
* @param {String} params.code 微信登录code
* @param {String} params.nickname 昵称
* @param {String} params.headimg 头像
* @param {String} params.pid 推荐人ID
* @returns {Promise} 登录结果
*/
export const wxLogin = async (params = {}) => {
return await RequestManager.post('/login', params);
};
/**
* 手机号验证码登录
* @param {String} mobile 手机号
* @param {String} code 验证码
* @param {String} pid 推荐人ID
* @returns {Promise} 登录结果
*/
export const mobileLogin = async (mobile, code, pid = '') => {
return await RequestManager.post('/mobileLogin', {
mobile,
code,
pid
});
};
/**
* 发送短信验证码
* @param {String} phone 手机号
* @returns {Promise} 发送结果
*/
export const sendSms = async (phone) => {
return await RequestManager.post('/v2/account/sendSms', { phone });
};
/**
* 微信绑定手机号(通过微信授权)
* @param {String} code 微信授权code
* @returns {Promise} 绑定结果
*/
export const bindMobileByWx = async (code) => {
return await RequestManager.post('/login_bind_mobile', { code });
};
/**
* 验证码绑定手机号H5端
* @param {String} mobile 手机号
* @param {String} code 验证码
* @returns {Promise} 绑定结果
*/
export const bindMobileByCode = async (mobile, code) => {
return await RequestManager.post('/login_bind_mobile_h5', {
mobile,
code
});
};
/**
* 刷新Token
* @param {String} refreshToken 刷新令牌
* @returns {Promise} 刷新结果包含新的accessToken、refreshToken、expiresIn
*/
export const refreshToken = async (refreshToken) => {
return await RequestManager.post('/refresh', {
refreshToken
});
};
/**
* 退出登录撤销Refresh Token
* @returns {Promise} 退出结果
*/
export const logout = async () => {
const storedRefreshToken = uni.getStorageSync('refreshToken');
if (storedRefreshToken) {
try {
await RequestManager.post('/logout', {
refreshToken: storedRefreshToken
});
} catch (error) {
console.log('撤销Token失败继续清除本地存储:', error);
}
}
// 无论后端调用是否成功,都清除本地存储
clearLoginTokens();
};
/**
* 记录登录
* @returns {Promise} 记录结果
*/
export const recordLogin = async () => {
return await RequestManager.post('/login_record', {});
};
/**
* 账号注销
* @returns {Promise} 注销结果
*/
export const logOff = async () => {
return await RequestManager.post('/user_log_off', {});
};
/**
* 绑定邀请码
* @param {String} inviteCode 邀请码
* @returns {Promise} 绑定结果
*/
export const bindInviteCode = async (inviteCode) => {
return await RequestManager.post('/bind_invite_code', {
invite_code: inviteCode
});
};