高木のブログ

【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 形式のレスポンスに統一することができる


ytkg

Written by ytkg, Twitter, GitHub