Files
yunzerwebsiteallinone/uniapp/api/auth.js
T
2026-10-07 13:46:32 +08:00

290 lines
6.6 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.
/**
* 移动端认证接口 — 对接 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) {
return request({
url: '/auth/switch-tenant',
method: 'POST',
data: Object.assign({ client_id: 'yz-uniapp' }, 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 }