Skip to content
On this page

hono-basic-auth

简介

hono-basic-auth 是 Hono 框架的基本认证(Basic Authentication)中间件,它提供了一种简单的方式来保护 API 或网站,要求用户提供用户名和密码才能访问。这种认证方式适用于内部工具、开发环境或不需要高级安全性的场景。

安装

bash
npm install hono @hono/basic-auth

基本使用

typescript
import { Hono } from 'hono'
import { basicAuth } from '@hono/basic-auth'

const app = new Hono()

// 应用基本认证中间件
app.use(
  '*',
  basicAuth({
    username: 'admin',
    password: 'password123',
  }),
)

app.get('/', (c) => {
  return c.text('受保护的内容')
})

app.listen(3000)

高级配置

typescript
import { Hono } from 'hono'
import { basicAuth } from '@hono/basic-auth'

const app = new Hono()

// 多用户认证
const users = {
  admin: 'admin123',
  user1: 'password1',
  user2: 'password2',
}

app.use(
  '/admin/*',
  basicAuth({
    // 自定义验证函数
    verifyUser: async (username, password, c) => {
      // 检查用户是否存在且密码匹配
      if (users[username] && users[username] === password) {
        // 可以在上下文中存储用户信息,供后续中间件使用
        c.set('user', { username })
        return true
      }
      return false
    },

    // 自定义认证失败响应
    unauthorized: (c) => {
      return c.text('认证失败:请提供有效的用户名和密码', 401)
    },

    // 自定义认证领域(显示在浏览器认证对话框中)
    realm: '管理员区域',
  }),
)

// 不同路径使用不同认证配置
app.use(
  '/api/*',
  basicAuth({
    username: 'apiuser',
    password: 'apipassword',
    realm: 'API 访问',
  }),
)

// 条件认证(例如,只在生产环境启用)
const isProd = process.env.NODE_ENV === 'production'

if (isProd) {
  app.use(
    '/beta/*',
    basicAuth({
      username: process.env.BETA_USER || 'beta',
      password: process.env.BETA_PASSWORD || 'betapass',
      realm: 'Beta 测试',
    }),
  )
}

// 使用环境变量存储凭据
app.use(
  '/secure/*',
  basicAuth({
    username: process.env.AUTH_USER || 'default',
    password: process.env.AUTH_PASSWORD || 'default',
    // 在没有设置环境变量时禁用认证
    skip: !process.env.AUTH_USER || !process.env.AUTH_PASSWORD,
  }),
)

注意事项

  1. 基本认证以明文形式传输凭据(Base64 编码但未加密),应始终与 HTTPS 一起使用
  2. 不适合用作主要的用户认证系统,更适合内部工具或临时保护
  3. 在生产环境中,避免硬编码凭据,使用环境变量或安全的配置管理
  4. 基本认证会在每个请求中发送凭据,不需要管理会话或 Cookie
  5. 某些代理或 CDN 可能会移除或修改认证头,需要特别配置
  6. 用户体验不佳,因为浏览器显示的认证对话框不能自定义样式

要保持清醒 永远不抱有意外的幻想 凭空的期待最要命