【Hono】Basic 認証で認証失敗時のレスポンスをカスタムする方法
2022/08/09
Hono で Basic 認証を実装したい時、ミドルウェアを使えばサクッと実現できる
import { Hono } from 'hono'
import { basicAuth } from 'hono/basic-auth'
const app = new Hono()
const username = 'hono'
const password = 'acoolproject'
app.use('/auth/*', basicAuth({ username, password }))
app.get('/auth', (c) => c.json({ message: 'Authorized.' }))
export default app
$ curl --user hono:acoolproject localhost:8787/auth
{"message":"Authorized."}
しかし、認証に失敗した時のレスポンスが固定で「Unauthorized」なっている
$ curl --user hono:foooooo localhost:8787/auth
Unauthorized
https://github.com/honojs/hono/blob/8879f241e895ab5229baa40d12144817ca1aa3d3/src/middleware/basic-auth/index.ts#L58
ソースを見たけど、ベタ書きになっていて指定できそうにもなかったので、Issue に質問を投げてみた
ステータスコード 401 をキャッチするカスタムミドルウェアを書いたら実現できるよとすぐに返答が
app.use('/auth/*', async (c, next) => {
await next()
if (c.res.status === 401) {
return c.json({ message: 'Unauthorized.' }, 401)
}
})
$ curl --user hono:foooooo localhost:8787/auth
{"message":"Unauthorized."}
これで成功時も失敗時も同じ JSON 形式のレスポンスに統一することができる