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 }[]
レシピ
複数のユーザーの定義
このミドルウェアでは、username
とpassword
のペアを定義するオブジェクトを含む任意のパラメータを渡すこともできます。
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)
)
)