@bagelink/auth

中文文档
1.20.64发布于 2026/11/07MITTypeScriptESM + CJS近 30 天下载 1.5万

Bagelink 认证软件包

中文使用文档
文档目录31 节
  1. 特征
  2. 安装
  3. 快速启动
  4. 1. 初始化 Auth
  5. 2. 界定路线
  6. 3. 组件的使用
  7. 文档
  8. 核心 API
  9. createAuth(config)
  10. useAuth()
  11. 自定义后卫构成
  12. 构成部分
  13. 预建页面
  14. 窗体组件
  15. SSO 整合
  16. 快速SSO 登录
  17. SSO 回调路由
  18. 现有供应商
  19. SSO 重定向保存
  20. 高级配置
  21. 安全性:限制方向路径
  22. 禁用自动重定向
  23. 自定义路由Meta 密钥
  24. 事件系统
  25. 类型脚本支持
  26. 实例
  27. 保护路线流
  28. 自定义登录页面
  29. 基于角色的获取
  30. 移徙
  31. 许可证

翻译:

具有内置SSO支持的Bagelink应用程序的现代认证库,自动重定向处理,和Vue组件.

特征

  • 🔐 完整认证流量 - 登录、注册、密码重置、电子邮件核查
  • 🚀 SSO 准备 - 谷歌、GitHub、微软、苹果、奥克塔、Facebook
  • 🔄 自动定向 - 自动处理登录后导航
  • 🛡️ 内部安保 - 防止公开定向攻击
  • 🎨 Vue 组件 - 预建表格和页面
  • 📱 类型安全 - 全部类型脚本支持
  • 🧩 路由器集成 - 保护路线的聪明警卫

安装

npm install @bagelink/auth

快速启动

1. 初始化 Auth

// main.ts
import { createApp } from 'vue'
import { createAuth } from '@bagelink/auth'
import router from './router'

const auth = createAuth({
  baseURL: 'https://api.your-app.com',
  redirect: {
    loginRoute: 'Login',
    fallback: '/dashboard',
    autoRedirect: true,  // Automatic post-login redirect
  }
})

// Connect router (automatically sets up auth guard)
auth.use(router)

const app = createApp(App)
app.use(router)
app.use(auth)  // Optional: adds $auth globally
app.mount('#app')

2. 界定路线

// router/index.ts
import { createRouter, createWebHistory } from 'vue-router'

const routes = [
  {
    path: '/login',
    name: 'Login',
    component: () => import('@/views/Login.vue'),
  },
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: () => import('@/views/Dashboard.vue'),
    meta: { auth: true },  // Protected route
  },
]

export default createRouter({
  history: createWebHistory(),
  routes,
})

3. 组件的使用

<script setup lang="ts">
import { useAuth } from '@bagelink/auth'

const auth = useAuth()

async function handleLogin() {
  await auth.login({
    email: '[email protected]',
    password: 'password'
  })
  // Auto-redirect happens automatically! 🎉
}
</script>

<template>
  <div v-if="auth.user.value">
    <p>Welcome, {{ auth.user.value.name }}!</p>
    <button @click="auth.logout()">Logout</button>
  </div>
</template>

文档

核心 API

createAuth(config)

初始化重定向配置的认证模块 :

createAuth({
  baseURL: string,              // Required: Your API base URL
  redirect?: {
    loginRoute?: string,        // Login route name (default: 'Login')
    fallback?: string,          // Default redirect after login (default: '/')
    queryKey?: string,          // Query param for redirect URL (default: 'redirect')
    autoRedirect?: boolean,     // Auto-redirect after login (default: true)
    preserveRedirect?: boolean,   // Preserve original URL (default: true)
    noAuthRoutes?: string[],    // Routes requiring no auth (default: ['Login', 'Signup', ...])
    allowedPaths?: RegExp[],    // Optional: Restrict allowed redirects for security
  }
})

useAuth()

返回可与 :

{
  // State
  user: Ref<User | null>
  accountInfo: Ref<AccountInfo | null>
  
  // Authentication
  login(credentials): Promise<AuthenticationResponse>
  signup(data): Promise<AuthenticationResponse>
  logout(): Promise<void>
  checkAuth(): Promise<boolean>
  
  // SSO
  sso: {
    google: { redirect(), callback() }
    github: { redirect(), callback() }
    microsoft: { redirect(), callback() }
    // ... more providers
  }
  
  // Password Management
  forgotPassword(email): Promise<void>
  resetPassword(token, newPassword): Promise<void>
  changePassword(current, new): Promise<void>
  
  // Profile
  updateProfile(updates): Promise<void>
  
  // Getters
  getFullName(): string
  getIsLoggedIn(): boolean
  getEmail(): string
  getRoles(): string[]
}

自定义后卫构成

对于多租户应用程序或高级许可逻辑,可禁用自动守护并自编曲:

import { composeGuards } from '@bagelink/auth'

// Disable auto-guard
auth.use(router, { guard: false })

// Custom org access guard
const orgAccessGuard = () => async (to, from, next) => {
  if (to.meta.requiresOrg) {
    const hasAccess = await checkOrgAccess(to.params.orgId)
    if (!hasAccess) return next('/no-access')
  }
  next()
}

// Compose all guards in sequence
router.beforeEach(composeGuards([
  auth.routerGuard(),  // Auth first
  orgAccessGuard(),    // Then org check
]))

备选案文2:多重 beforeEach 电话

auth.use(router, { guard: false })

// Guards run in order they're registered
router.beforeEach(auth.routerGuard())

router.beforeEach(async (to, from, next) => {
  // Custom org/tenant check
  if (to.meta.requiresOrg && !await checkOrgAccess(to.params.orgId)) {
    return next('/no-access')
  }
  next()
})

备选办法3:手工组成

auth.use(router, { guard: false })

router.beforeEach(async (to, from, next) => {
  // Run auth guard first
  const authPassed = await new Promise<boolean>((resolve) => {
    auth.routerGuard()(to, from, (result?: any) => {
      if (result !== undefined) {
        next(result)
        resolve(false)
      } else {
        resolve(true)
      }
    })
  })
  
  if (!authPassed) return
  
  // Your custom logic
  if (to.meta.requiresOrg && !await checkOrgAccess(to.params.orgId)) {
    return next('/no-access')
  }
  
  next()
})

构成部分

预建页面

<script setup>
import { LoginPage, SignupPage, ForgotPasswordPage } from '@bagelink/auth'
</script>

<template>
  <LoginPage
    :texts="{ title: 'Welcome Back' }"
    card-width="400px"
  />
</template>

窗体组件

对于自定义布局 :

<script setup>
import { LoginForm, SignupForm } from '@bagelink/auth'
</script>

<template>
  <div class="custom-layout">
    <LoginForm
      :texts="{ title: 'Sign In' }"
      :show-google="true"
      :show-github="true"
    />
  </div>
</template>

SSO 整合

快速SSO 登录

const { sso } = useAuth()

// Redirect to Google OAuth
await sso.google.redirect({
  redirect_uri: `${window.location.origin}/auth/callback`
})

SSO 回调路由

// router.ts
{
  path: '/auth/callback',
  name: 'AuthCallback',
  component: () => import('@bagelink/auth').then(m => m.Callback),
}

现有供应商

  • 谷歌
  • GitHub 图像
  • 微软
  • 苹果公司
  • 奥克塔
  • 脸书

SSO 重定向保存

当用户访问受保护的路由并通过SSO认证时,会自动保存原始的URL:

// User tries to access /dashboard (protected)
// ↓ Redirected to /login?redirect=/dashboard
// ↓ User clicks "Login with Google"
// ↓ Goes to Google OAuth
// ↓ Returns to /auth/callback
// ↓ Automatically redirected to /dashboard ✅

如何运作:

  1. 这个 redirect 查询参数存储于 sessionStorage 在SSO重定向前
  2. OAuth 回电后恢复到 URL
  3. 自动重定向( 或手动倒置) 使用它来导航到原目的地

具有方向的手动SSO :

// On login page with ?redirect=/dashboard
await sso.google.redirect()
// Redirect param is automatically preserved across the OAuth flow

高级配置

安全性:限制方向路径

createAuth({
  baseURL: 'https://api.example.com',
  redirect: {
    allowedPaths: [
      /^\/dashboard/,
      /^\/profile/,
      /^\/settings/,
    ],
    // Only these paths can be redirect targets
  }
})

禁用自动重定向

对于自定义逻辑 :

createAuth({
  redirect: {
    autoRedirect: false,  // Manual control
  }
})

// Then in login handler:
import { performRedirect, getRedirectConfig } from '@bagelink/auth'

await auth.login(credentials)
await performRedirect(router, getRedirectConfig())

自定义路由Meta 密钥

createAuth({
  redirect: {
    authMetaKey: 'requiresAuth',  // Default: 'auth'
  }
})

// Then in routes:
{
  path: '/dashboard',
  meta: { requiresAuth: true }  // Custom meta key
}

事件系统

听从认证事件 :

import { createAuth, AuthState } from '@bagelink/auth'

const auth = createAuth({ ... })

auth.on(AuthState.LOGIN, () => {
  console.log('User logged in')
})

auth.on(AuthState.LOGOUT, () => {
  console.log('User logged out')
})

auth.on(AuthState.PROFILE_UPDATE, () => {
  console.log('Profile updated')
})

可用事件 :

  • LOGIN
  • LOGOUT
  • SIGNUP
  • PASSWORD_RESET
  • PASSWORD_CHANGE
  • PROFILE_UPDATE
  • AUTH_CHECK
  • EMAIL_VERIFIED
  • SESSION_REFRESH

类型脚本支持

完整类型的定义包括:

import type {
  User,
  AccountInfo,
  AuthState,
  SSOProvider,
  RedirectConfig,
  LoginTexts,
  SignupTexts,
} from '@bagelink/auth'

实例

保护路线流

  1. 用户访问 /dashboard (保护)
  2. 未经认证 + 重新定向到 /login?redirect=/dashboard
  3. 用户日志在
  4. 自动重定向到 /dashboard

自定义登录页面

<script setup lang="ts">
import { ref } from 'vue'
import { useAuth } from '@bagelink/auth'

const auth = useAuth()
const email = ref('')
const password = ref('')
const error = ref('')

async function handleLogin() {
  try {
    await auth.login({ email: email.value, password: password.value })
    // Auto-redirect happens automatically!
  } catch (err: any) {
    error.value = err.response?.data?.message || 'Login failed'
  }
}
</script>

<template>
  <form @submit.prevent="handleLogin">
    <input v-model="email" type="email" placeholder="Email" />
    <input v-model="password" type="password" placeholder="Password" />
    <button type="submit">Login</button>
    <p v-if="error" class="error">{{ error }}</p>
  </form>
</template>

基于角色的获取

import { useAuth } from '@bagelink/auth'

const auth = useAuth()

// Check if user has admin role
if (auth.getRoles().includes('admin')) {
  // Allow access
}

// Or in route guard
router.beforeEach((to, from, next) => {
  if (to.meta.requiresAdmin && !auth.getRoles().includes('admin')) {
    next('/unauthorized')
  } else {
    next()
  }
})

移徙

见 呼吸 变化.md 用于以往版本的移徙指南.

许可证

麻省理工学院

版本与发布记录

@bagelink/auth 共发布 721 个版本,首次发布于 2025/03/25;过去 12 个月发布了 571 个版本。

版本发布日期距今
1.20.64latest2026/11/071 天前
1.20.582026/11/061 天前
1.20.562026/11/062 天前
1.20.542026/11/062 天前
1.20.522026/11/052 天前
1.20.502026/11/052 天前

关于 @bagelink/auth 的常见问题

@bagelink/auth 是什么?

Bagelink 认证软件包

如何安装 @bagelink/auth?

在项目目录运行 npm install @bagelink/auth,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:vue(^3.0.0)、vue-router(^4.0.0 || ^5.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@bagelink/auth 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@bagelink/auth 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@bagelink/auth 可以商用吗?

@bagelink/auth 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@bagelink/auth 的下载量有多少?

根据 npm 官方下载统计,@bagelink/auth 在 2026/10/08 – 2026/11/06 这 30 天内被下载 14,604 次,日均约 487 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bagelink/auth 还在维护吗?

最新版本 1.20.64 发布于 2026/11/07(1 天前);至今共发布 721 个版本,其中过去 12 个月发布了 571 个;首次发布于 2025/03/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。