跳至内容

基本身份验证中间件

此中间件可以将基本身份验证应用于指定的路径。使用 Cloudflare Workers 或其他平台实现基本身份验证比看起来更复杂,但使用此中间件,它非常简单。

有关基本身份验证方案在幕后工作原理的更多信息,请参见 MDN 文档

导入

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

用法

ts
const app = new Hono()

app.use(
  '/auth/*',
  basicAuth({
    username: 'hono',
    password: 'acoolproject',
  })
)

app.get('/auth/page', (c) => {
  return c.text('You are authorized')
})

要限制特定路由 + 方法

ts
const app = new Hono()

app.get('/auth/page', (c) => {
  return c.text('Viewing page')
})

app.delete(
  '/auth/page',
  basicAuth({ username: 'hono', password: 'acoolproject' }),
  (c) => {
    return c.text('Page deleted')
  }
)

如果要自己验证用户,请指定 verifyUser 选项;返回 true 表示接受。

ts
const app = new Hono()

app.use(
  basicAuth({
    verifyUser: (username, password, c) => {
      return (
        username === 'dynamic-user' && password === 'hono-password'
      )
    },
  })
)

选项

必需 username: string

正在进行身份验证的用户的用户名。

必需 password: string

用于提供的用户名以进行身份验证的密码值。

可选 realm: string

领域域名的名称,作为返回的 WWW-Authenticate 挑战标头的一部分。默认值为 "Secure Area"
了解更多: https://mdn.org.cn/en-US/docs/Web/HTTP/Headers/WWW-Authenticate#directives

可选 hashFunction: Function

用于处理散列以安全比较密码的函数。

可选 verifyUser: (username: string, password: string, c: Context) => boolean | Promise<boolean>

用于验证用户的函数。

可选 invalidUserMessage: string | object | MessageFunction

MessageFunction(c: Context) => string | object | Promise<string | object>。如果用户无效,则自定义消息。

更多选项

可选 ...users: { username: string, password: string }[]

食谱

定义多个用户

此中间件还允许您传递包含定义更多 usernamepassword 对的对象的任意参数。

ts
app.use(
  '/auth/*',
  basicAuth(
    {
      username: 'hono',
      password: 'acoolproject',
      // Define other params in the first object
      realm: 'www.example.com',
    },
    {
      username: 'hono-admin',
      password: 'super-secure',
      // Cannot redefine other params here
    },
    {
      username: 'hono-user-1',
      password: 'a-secret',
      // Or here
    }
  )
)

或不那么硬编码

ts
import { users } from '../config/users'

app.use(
  '/auth/*',
  basicAuth(
    {
      realm: 'www.example.com',
      ...users[0],
    },
    ...users.slice(1)
  )
)

在 MIT 许可下发布。