useApiAuth
API 认证 composable,提供登录、登出和 Session 管理,与 nuxt-auth-utils 无缝集成。
Usage
使用自动导入的 useApiAuth composable 管理用户认证,包括登录、登出、Session 管理等功能。与 nuxt-auth-utils 完全集成。
<script setup lang="ts">
// 获取认证相关方法和状态
const { login, clear, loggedIn, user } = useApiAuth()
// 基础登录
const handleLogin = async () => {
await login({
loginPath: '/auth/login',
credentials: {
username: 'admin',
password: '123456'
}
})
// 登录成功后跳转
if (loggedIn.value) {
navigateTo('/dashboard')
}
}
// 登出
const handleLogout = async () => {
await clear()
navigateTo('/login')
}
// 响应式状态
watchEffect(() => {
if (loggedIn.value) {
console.log('当前用户:', user.value)
}
})
</script>
useApiAuth基于nuxt-auth-utils提供的 Session 管理功能。- 支持自动获取用户信息、自定义 token 提取和 session 构建。
- 登录后 token 会自动添加到后续 API 请求的请求头。
useApiAuth 依赖 nuxt-auth-utils 模块。确保已安装并正确配置该模块。登录流程
login() 方法执行以下步骤:
- 调用登录接口,传递凭证
- 从响应中提取 token(通过
tokenExtractor) - 如果提供
userInfoPath,使用 token 调用用户信息接口 - 构建 session 数据(通过
sessionBuilder) - 设置 session 到服务端
- 刷新客户端 session 状态
// 完整流程示例
await login({
// 1. 登录接口
loginPath: '/auth/login',
credentials: { username: 'admin', password: '123456' },
// 2. 用户信息接口(可选)
userInfoPath: '/auth/me',
// 3. 自定义 token 提取
tokenExtractor: (res) => res.data?.accessToken,
// 4. 自定义 session 构建
sessionBuilder: (user, token) => ({
user: { id: user.id, name: user.name },
secure: { token, permissions: user.permissions }
})
})
Token 提取
默认 tokenExtractor 会依次尝试以下路径:
data.tokendata.accessTokentoken
如果 API 响应格式不同,可以自定义提取逻辑:
// 自定义 token 路径
await login({
loginPath: '/auth/login',
credentials: { username: 'admin', password: '123456' },
tokenExtractor: (res) => res.data?.jwt // 从 data.jwt 提取
})
// 复杂嵌套结构
await login({
loginPath: '/auth/login',
credentials: { username: 'admin', password: '123456' },
tokenExtractor: (res) => res.data?.session?.accessToken
})
Session 构建
默认 sessionBuilder 构建以下 session 结构:
{
user: User, // 用户信息
token: string, // 访问令牌
loggedInAt: string // 登录时间(ISO 格式)
}
可以自定义 session 结构,例如分离敏感数据:
await login({
loginPath: '/auth/login',
credentials: { username: 'admin', password: '123456' },
sessionBuilder: (user, token) => ({
user: {
id: user.id,
name: user.name,
avatar: user.avatar
},
secure: {
token,
refreshToken: user.refreshToken,
permissions: user.permissions
}
})
})
nuxt-auth-utils 会自动加密 secure 字段,保护敏感数据。Session 配置
通过 sessionConfig 选项可以自定义 Session 的行为,包括过期时间、Cookie 配置等。
默认配置
nuxt.config.ts
{
name: useSiteConfig().name,
password: process.env.NUXT_SESSION_PASSWORD || '',
cookie: {
sameSite: 'lax'
}
}
生产环境务必设置
NUXT_SESSION_PASSWORD 环境变量,用于加密 Session 数据。建议使用至少 32 位的随机字符串。用户信息获取
有两种方式获取用户信息:
方式 1: 从登录响应获取
// 登录响应包含用户信息
await login({
loginPath: '/auth/login',
credentials: { username: 'admin', password: '123456' }
})
// 用户信息从登录响应的 data 字段提取
登录响应格式示例:
{
"code": 200,
"message": "登录成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"id": 1,
"name": "Admin",
"email": "admin@example.com"
}
}
方式 2: 调用独立的用户信息接口
// 使用 userInfoPath 自动调用用户信息接口
await login({
loginPath: '/auth/login',
credentials: { username: 'admin', password: '123456' },
userInfoPath: '/auth/me' // 使用 token 调用此接口
})
此方式会自动:
- 从登录响应提取 token
- 使用 token 调用
/auth/me - 将用户信息接口的响应作为用户数据
API
useApiAuth()
useApiAuth(): UseApiAuthReturn
创建认证管理器。
Returns
返回包含以下方法和属性的认证管理器对象:
login()
<LoginRData = unknown>(options: LoginOptions<LoginRData>) => Promise<LoginResult>
执行登录流程。
Parameters
loginPath
string required
登录接口路径。
credentials
Record<string, unknown> required
登录凭证(如用户名、密码)。
userInfoPath
string
用户信息接口路径。如果提供,登录后会使用 token 调用此接口获取用户信息。
tokenExtractor
(response: ApiResponse<LoginRData>) => string | null | undefined
自定义 token 提取函数。默认从
data.token、data.accessToken 或 token 字段提取。sessionBuilder
(user: User, token: string) => UserSession
自定义 session 构建函数。默认返回
{ user, token, loggedInAt }。sessionConfig
Partial<SessionConfig>
Session 配置选项,用于自定义 Session 的行为。
- 查看 nuxt-auth-utils 文档
- 默认配置:
{ name: useSiteConfig().name, password: process.env.NUXT_SESSION_PASSWORD, cookie: { sameSite: 'lax' } }
endpoint
string
使用指定的端点配置。
Returns
返回 Promise<LoginResult>,包含:
user: User- 用户信息token: string- 访问令牌
loggedIn
Ref<boolean>
是否已登录(响应式)。
user
Ref<User | null>
当前用户信息(响应式)。
session
Ref<UserSession | null>
当前 session 数据(响应式)。
fetch()
() => Promise<void>
刷新 session 状态。
clear()
() => Promise<void>
清除 session(登出)。