294 lines
6.7 KiB
JavaScript
294 lines
6.7 KiB
JavaScript
/**
|
||
* 移动端认证接口 — 对接 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 绑定到该账号(静默调用,失败不提示)。
|
||
* 小程序认证中 / 未开通手机号能力时,一键登录靠这条绑定按 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'
|
||
})
|
||
}
|
||
|
||
/** 是否开启登录人机/验证码校验 */
|
||
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 }
|