/** * 移动端认证接口 — 对接 Go /api/* */ import { request, requestRaw } from '@/api/request.js' /** 账号密码登录(旧:租户端直登) */ export function login(data) { return request({ url: '/api/login', method: 'POST', data }) } /* ==================== 统一认证中心(UAC) ==================== * APP / 小程序不走浏览器跳转,直接用密码直连模式: * POST /auth/login 拿 access + refresh,多企业时再调 switch-tenant。 * 开关:默认即为统一认证,VITE_AUTH_MODE=legacy 时回退旧直登 * (见 utils/auth.js 的 isSSOEnabled) * ============================================================ */ /** 统一认证:账号密码登录 */ export function loginUAC(data) { // 小程序端与一键登录同用 yz-miniapp:后端据此跳过极验(小程序无 SDK 支持) let clientId = 'yz-uniapp' // #ifdef MP-WEIXIN clientId = 'yz-miniapp' // #endif return request({ url: '/auth/login', method: 'POST', data: Object.assign({ client_id: clientId }, data) }) } /** 统一认证:选择/切换企业(一人多企业) */ export function switchTenant(data) { let clientId = 'yz-uniapp' // #ifdef MP-WEIXIN clientId = 'yz-miniapp' // #endif return request({ url: '/auth/switch-tenant', method: 'POST', data: Object.assign({ client_id: clientId }, data) }) } /** 统一认证:拉取当前登录用户(userinfo,返回扁平结构无 code 包装) */ export function fetchUserInfo() { return request({ url: '/auth/userinfo', method: 'GET', silent: true }) } /** 统一认证:登录人机验证配置(极验 captcha_id 等) */ export function getAuthVerifyConfig(params = {}) { return request({ url: '/auth/verify-config', method: 'GET', data: params, silent: true, timeout: 8000 }) } /** 统一认证:单点登出(吊销会话与令牌) */ export function logoutUAC() { return request({ url: '/auth/logout', method: 'POST', silent: true, timeout: 5000 }) } /** * 申请「移动端免登录票据」:用当前登录态换一个一次性票据, * Web 端拿它换自己的令牌,实现移动端打开 Web 功能页时不二次登录。 * 票据一次性、60 秒有效。 */ export function createAppTicket(clientId = 'yz-backend') { return request({ url: '/auth/app-ticket', method: 'POST', data: { client_id: clientId }, silent: true, timeout: 8000 }) } /* ==================== 微信小程序一键登录 ==================== * 仅小程序端可用:uni.login 拿 code + getPhoneNumber 拿动态 code, * 由服务端换取 openid / 手机号并定位统一身份,签发同一套 UAC 令牌。 * ============================================================ */ /** 小程序登录是否已开通(未开通时前端隐藏一键登录入口) */ export function getMiniappLoginConfig() { return request({ url: '/auth/wechat/miniapp/config', method: 'GET', silent: true, timeout: 8000 }) } /** * 小程序一键登录 * @param {{ code: string, phoneCode?: string }} params code=uni.login 的 code;phoneCode=getPhoneNumber 的动态 code */ export function loginByMiniapp({ code, phoneCode = '' } = {}) { return request({ url: '/auth/wechat/miniapp/login', method: 'POST', data: { client_id: 'yz-miniapp', code, phone_code: phoneCode } }) } /** * 小程序端确认注册:网页注册页展示的小程序码扫码进入本页, * 用户点确认后由服务端把 openid 绑定到该注册会话,网页端即可继续注册。 * @param {{ scene: string, code: string, phoneCode?: string, appid?: string }} params */ export function confirmMiniappRegister({ scene, code, phoneCode = '', appid = '' } = {}) { return request({ url: '/auth/register/mini/confirm', method: 'POST', data: { scene, code, phone_code: phoneCode, appid } }) } /** * 已登录态下把当前微信 openid 绑定到该账号(静默调用,失败不提示)。 * 小程序认证中 / 未开通手机号能力时,一键登录靠这条绑定按 openid 认人。 */ export function bindMiniapp(data) { return request({ url: '/auth/wechat/miniapp/bind', method: 'POST', data: Object.assign({ client_id: 'yz-miniapp' }, data), silent: true, timeout: 8000 }) } /** 统一认证:刷新访问令牌 */ export function refreshTokenUAC(data) { return request({ url: '/auth/token', method: 'POST', header: { 'Content-Type': 'application/x-www-form-urlencoded' }, data: Object.assign({ grant_type: 'refresh_token', client_id: 'yz-uniapp' }, data), silent: true }) } /** 统一认证:吊销令牌(登出) */ export function revokeUAC(data = {}) { return request({ url: '/auth/revoke', method: 'POST', data, silent: true, timeout: 5000 }) } /** 发送登录验证码(账号二次校验用,需后台开启验证) */ export function sendLoginCode(data) { return request({ url: '/api/sendLoginCode', method: 'POST', data }) } /** 手机号验证码登录 */ export function loginBySms(data) { return request({ url: '/api/loginBySms', method: 'POST', data }) } /** 退出登录(后端无状态,失败可忽略;短超时避免卡住) */ export function logoutApi(data = {}) { return request({ url: '/api/logout', method: 'POST', data, silent: true, timeout: 5000 }) } /** 当前用户信息 */ export function getCurrentUser() { return request({ url: '/api/currentUser', method: 'GET' }) } /** 修改当前用户资料:{ name, email };手机号由微信验证,只读不传 */ export function updateCurrentUserProfile(data) { return request({ url: '/api/currentUser/profile', method: 'POST', data, silent: true }) } /** 是否开启登录人机/验证码校验 */ export function getOpenVerify() { return request({ url: '/api/login/getOpenVerify', method: 'GET', silent: true, timeout: 8000 }) } /** 极验 3 配置 */ export function getGeetest3Infos() { return request({ url: '/api/login/getGeetest3Infos', method: 'GET', silent: true }) } /** 极验 4 配置 */ export function getGeetest4Infos() { return request({ url: '/api/login/getGeetest4Infos', method: 'GET', silent: true, timeout: 8000 }) } /** 注册 */ export function register(data) { return request({ url: '/api/register', method: 'POST', data }) } /** 发送注册验证码 */ export function sendRegisterCode(data) { return request({ url: '/api/sendRegisterCode', method: 'POST', data }) } /** 重置密码 */ export function resetPassword(data) { return request({ url: '/api/resetPassword', method: 'POST', data }) } /** 验证租户和账号(找回密码第一步) */ export function verifyAccount(data) { return request({ url: '/api/verifyAccount', method: 'POST', data }) } /** 发送找回密码验证码(找回密码第二步) */ export function sendResetCode(data) { return request({ url: '/api/sendResetCode', method: 'POST', data }) } /** * 解析 getOpenVerify 返回的 label/value 列表 * @returns {Promise<{ openVerify: boolean, verifyType: string }>} */ export async function fetchVerifyConfig() { try { const data = await getOpenVerify() const list = Array.isArray(data) ? data : [] const map = {} list.forEach((item) => { if (item && item.label) map[item.label] = item.value }) return { openVerify: map.openVerify === '1' || map.openVerify === 1, verifyType: map.verifyType || '' } } catch { return { openVerify: false, verifyType: '' } } } export { requestRaw }