Skip to content

JWK Auth 中间件

JWK Auth 中间件会使用 JWK(JSON Web Key)验证令牌来为请求进行身份认证。它会检查 Authorization 请求头及其他配置来源(如设置了 cookie 选项时的 Cookie)。中间件会使用提供的 keys 验证令牌,或在指定 jwks_uri 时从该地址拉取公钥;如果设置了 cookie 选项,还会从 Cookie 中提取令牌。

INFO

客户端发送的 Authorization 头必须携带身份验证方案。

例如:Bearer my.token.valueBasic my.token.value

导入

ts
import { Hono } from 'hono'
import { jwk } from 'hono/jwk'
import { verifyWithJwks } from 'hono/jwt'

用法

ts
const app = new Hono()

app.use(
  '/auth/*',
  jwk({
    jwks_uri: `https://${backendServer}/.well-known/jwks.json`,
  })
)

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

获取 payload:

ts
const app = new Hono()

app.use(
  '/auth/*',
  jwk({
    jwks_uri: `https://${backendServer}/.well-known/jwks.json`,
  })
)

app.get('/auth/page', (c) => {
  const payload = c.get('jwtPayload')
  return c.json(payload) // 例如:{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
})

允许匿名访问:

ts
const app = new Hono()

app.use(
  '/auth/*',
  jwk({
    jwks_uri: (c) =>
      `https://${c.env.authServer}/.well-known/jwks.json`,
    allow_anon: true,
  })
)

app.get('/auth/page', (c) => {
  const payload = c.get('jwtPayload')
  return c.json(payload ?? { message: 'hello anon' })
})

在中间件外使用 verifyWithJwks

verifyWithJwks 工具函数可以在 Hono 中间件之外校验 JWT,例如在 SvelteKit 的 SSR 页面或其他服务端环境中:

ts
const id_payload = await verifyWithJwks(
  id_token,
  {
    jwks_uri: 'https://your-auth-server/.well-known/jwks.json',
  },
  {
    cf: { cacheEverything: true, cacheTtl: 3600 },
  }
)

选项

optional keys:HonoJsonWebKey[] | (c: Context) => Promise<HonoJsonWebKey[]>

公钥数组,或返回公钥数组的函数。若传入函数,将收到 Context 作为参数。

optional jwks_uri:string | (c: Context) => Promise<string>

若设置该值,将会从对应 URI 拉取 JWK 列表(JSON 中的 keys 字段),并与 keys 选项中提供的公钥合并。也可以传入回调函数,根据 Context 动态生成 URI。

optional allow_anon:boolean

设为 true 时,即使请求未携带有效令牌也允许通过。可通过 c.get('jwtPayload') 判断请求是否已认证。默认值为 false

若设置该值,将使用该键名从 Cookie 头中提取令牌并进行验证。

optional headerName:string

要读取 JWT 的请求头名称,默认为 Authorization

Released under the MIT License.