기본 인증 미들웨어
이 미들웨어는 특정 경로에 기본 인증을 적용할 수 있다. Cloudflare Workers나 다른 플랫폼에서 기본 인증을 구현하는 것은 생각보다 복잡하지만, 이 미들웨어를 사용하면 간단하게 처리할 수 있다.
기본 인증 스킴이 어떻게 작동하는지 더 자세히 알고 싶다면 MDN 문서를 참고한다.
Import
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('인증에 성공했습니다')
})특정 라우트와 메서드에만 제한을 걸고 싶다면:
ts
const app = new Hono()
app.get('/auth/page', (c) => {
return c.text('페이지를 보고 있습니다')
})
app.delete(
'/auth/page',
basicAuth({ username: 'hono', password: 'acoolproject' }),
(c) => {
return c.text('페이지가 삭제되었습니다')
}
)사용자를 직접 확인하고 싶다면 verifyUser 옵션을 지정한다. true를 반환하면 인증이 성공한 것이다.
ts
const app = new Hono()
app.use(
basicAuth({
verifyUser: (username, password, c) => {
return (
username === 'dynamic-user' && password === 'hono-password'
)
},
})
)옵션
required username: string
인증 중인 사용자의 아이디를 나타낸다.
required password: string
제공된 사용자 이름에 대한 인증을 위한 비밀번호 값이다.
optional realm: string
WWW-Authenticate 응답 헤더에 포함되는 realm의 도메인 이름이다. 기본값은 "Secure Area"이다.
자세한 내용: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/WWW-Authenticate#directives
optional hashFunction: Function
비밀번호를 안전하게 비교하기 위한 해시 처리를 담당하는 함수다.
optional 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',
// 첫 번째 객체에서 다른 매개변수 정의
realm: 'www.example.com',
},
{
username: 'hono-admin',
password: 'super-secure',
// 여기서는 다른 매개변수를 재정의할 수 없음
},
{
username: 'hono-user-1',
password: 'a-secret',
// 여기서도 마찬가지
}
)
)또는 하드코딩을 줄일 수 있다:
ts
import { users } from '../config/users'
app.use(
'/auth/*',
basicAuth(
{
realm: 'www.example.com',
...users[0],
},
...users.slice(1)
)
)