コンテンツにスキップ

Basic認証ミドルウェア

このミドルウェアは、指定されたパスにBasic認証を適用できます。Cloudflare Workersやその他のプラットフォームでBasic認証を実装するのは見た目よりも複雑ですが、このミドルウェアを使用すれば簡単です。

Basic認証スキームの仕組みの詳細については、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://developer.mozilla.org/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ライセンスの下でリリースされています。