Bearer 认证中间件
Bearer 认证中间件通过验证请求头中的 API 令牌来提供身份验证。 访问端点的 HTTP 客户端将添加 Authorization
头,并将 Bearer {token}
作为头值。
使用终端中的 curl
,它看起来像这样:
sh
curl -H 'Authorization: Bearer honoiscool' http://localhost:8787/auth/page
导入
ts
import { Hono } from 'hono'
import { bearerAuth } from 'hono/bearer-auth'
用法
NOTE
你的 token
必须匹配正则表达式 /[A-Za-z0-9._~+/-]+=*/
,否则将返回 400 错误。值得注意的是,此正则表达式同时容纳 URL 安全的 Base64 编码和标准的 Base64 编码的 JWT。此中间件不要求 bearer 令牌是 JWT,仅要求它匹配上述正则表达式。
ts
const app = new Hono()
const token = 'honoiscool'
app.use('/api/*', bearerAuth({ token }))
app.get('/api/page', (c) => {
return c.json({ message: 'You are authorized' }) // 你已获得授权
})
要限制到特定的路由 + 方法:
ts
const app = new Hono()
const token = 'honoiscool'
app.get('/api/page', (c) => {
return c.json({ message: 'Read posts' }) // 读取帖子
})
app.post('/api/page', bearerAuth({ token }), (c) => {
return c.json({ message: 'Created post!' }, 201) // 创建了帖子!
})
要实现多令牌(例如,任何有效令牌都可以读取,但创建/更新/删除被限制为特权令牌):
ts
const app = new Hono()
const readToken = 'read'
const privilegedToken = 'read+write'
const privilegedMethods = ['POST', 'PUT', 'PATCH', 'DELETE']
app.on('GET', '/api/page/*', async (c, next) => {
// 有效令牌列表
const bearer = bearerAuth({ token: [readToken, privilegedToken] })
return bearer(c, next)
})
app.on(privilegedMethods, '/api/page/*', async (c, next) => {
// 单个有效特权令牌
const bearer = bearerAuth({ token: privilegedToken })
return bearer(c, next)
})
// 为 GET, POST 等定义处理程序。
如果你想自己验证令牌的值,请指定 verifyToken
选项;返回 true
表示接受。
ts
const app = new Hono()
app.use(
'/auth-verify-token/*',
bearerAuth({
verifyToken: async (token, c) => {
return token === 'dynamic-token'
},
})
)
选项
required token: string
| string[]
用于验证传入的 bearer 令牌的字符串。
optional realm: string
域的域名,作为返回的 WWW-Authenticate 质询头的一部分。 默认为 ""
。 更多信息请参阅:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/WWW-Authenticate#directives
optional prefix: string
Authorization 头值的前缀(或称为 schema
)。 默认为 "Bearer"
。
optional headerName: string
头名称。 默认值为 Authorization
。
optional hashFunction: Function
用于处理哈希以安全比较身份验证令牌的函数。
optional verifyToken: (token: string, c: Context) => boolean | Promise<boolean>
用于验证令牌的函数。
optional noAuthenticationHeaderMessage: string | object | MessageFunction
MessageFunction
是 (c: Context) => string | object | Promise<string | object>
。 如果没有身份验证头时的自定义消息。
optional invalidAuthenticationHeaderMessage: string | object | MessageFunction
身份验证头无效时的自定义消息。
optional invalidTokenMessage: string | object | MessageFunction
令牌无效时的自定义消息。