ForcePilot/web/src/apis/auth_api.js
Wenjie Zhang c342f3e1ee feat: 收紧用户管理部门隔离并重构知识库共享权限
- 普通管理员创建用户时固定归属本部门,用户列表/访问选项/详情/更新/删除均限制在本部门
- share_config 改为三档:global(全局共享)、department(部门共享)、user(指定人可访问)
- 部门共享必须包含当前用户部门,指定人可访问必须包含当前用户
- 前端 ShareConfigForm 重构为三档卡片选择+下拉菜单选人/选部门
- 补充部门隔离和共享权限过滤的集成测试
2026-05-26 17:39:13 +08:00

89 lines
2.1 KiB
JavaScript

/**
* 认证相关 API
*/
import { apiAdminGet } from './base'
async function parseErrorDetail(response, fallbackMessage) {
const contentType = response.headers.get('content-type') || ''
if (contentType.includes('application/json')) {
const error = await response.json()
return error?.detail || fallbackMessage
}
const text = (await response.text()).trim()
return text || fallbackMessage
}
/**
* 获取 OIDC 配置
* @returns {Promise<{enabled: boolean, provider_name?: string}>}
*/
async function getOIDCConfig() {
const response = await fetch('/api/auth/oidc/config')
if (!response.ok) {
throw new Error('获取 OIDC 配置失败')
}
return response.json()
}
/**
* 获取 OIDC 登录 URL
* @param {string} redirectPath - 登录后的重定向路径
* @returns {Promise<{login_url: string}>}
*/
async function getOIDCLoginUrl(redirectPath = '/') {
const params = new URLSearchParams({ redirect_path: redirectPath })
const response = await fetch(`/api/auth/oidc/login-url?${params}`)
if (!response.ok) {
const detail = await parseErrorDetail(response, '获取 OIDC 登录地址失败')
throw new Error(detail)
}
return response.json()
}
/**
* 使用一次性 code 交换 OIDC 登录结果
* @param {string} code - 一次性登录 code
* @returns {Promise<{
* access_token: string,
* token_type: string,
* user_id: number,
* username: string,
* uid: string,
* phone_number: string | null,
* avatar: string | null,
* role: string,
* department_id: number | null,
* department_name: string | null
* }>}
*/
async function getUserAccessOptions() {
return apiAdminGet('/api/auth/users/access-options')
}
async function exchangeOIDCCode(code) {
const response = await fetch('/api/auth/oidc/exchange-code', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ code })
})
if (!response.ok) {
const detail = await parseErrorDetail(response, 'OIDC 登录失败')
throw new Error(detail)
}
return response.json()
}
export const authApi = {
getOIDCConfig,
getOIDCLoginUrl,
getUserAccessOptions,
exchangeOIDCCode
}