Skip to content

기본 인증 미들웨어

이 미들웨어는 특정 경로에 기본 인증을 적용할 수 있다. 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 }[]

레시피

여러 사용자 정의하기

이 미들웨어를 사용하면 추가적인 usernamepassword 쌍을 정의하는 객체를 포함한 임의의 매개변수를 전달할 수 있다.

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)
  )
)

Released under the MIT License.