基本認証ガード

基本認証ガード

基本認証ガードは、HTTP認証フレームワークの実装です。クライアントはユーザーの資格情報をBase64エンコードされた文字列としてAuthorizationヘッダーを介して送信する必要があります。サーバーは資格情報が有効であればリクエストを許可します。それ以外の場合は、Webネイティブのプロンプトが表示され、資格情報の再入力を求めます。

ガードの設定

認証ガードはconfig/auth.tsファイル内で定義されます。このファイルのguardsオブジェクトの下に複数のガードを設定できます。

import { defineConfig } from '@adonisjs/auth'
import { basicAuthGuard, basicAuthUserProvider } from '@adonisjs/auth/build/src/Providers/BasicAuth'
const authConfig = defineConfig({
default: 'basicAuth',
guards: {
basicAuth: basicAuthGuard({
provider: basicAuthUserProvider({
model: () => import('#models/user'),
}),
})
},
})
export default authConfig

basicAuthGuardメソッドはBasicAuthGuardクラスのインスタンスを作成します。これは認証中にユーザーを検索するために使用できるユーザープロバイダーを受け入れます。

basicAuthUserProviderメソッドはBasicAuthLucidUserProviderクラスのインスタンスを作成します。これはユーザーの資格情報を検証するために使用するモデルへの参照を受け入れます。

ユーザーモデルの準備

basicAuthUserProviderで設定されたモデル(この例ではUserモデル)は、認証中にユーザーの資格情報を検証するためにAuthFinderミックスインを使用する必要があります。

import { DateTime } from 'luxon'
import { compose } from '@adonisjs/core/helpers'
import { BaseModel, column } from '@adonisjs/lucid/orm'
import hash from '@adonisjs/core/services/hash'
import { withAuthFinder } from '@adonisjs/auth/mixins/lucid'
const AuthFinder = withAuthFinder(() => hash.use('scrypt'), {
uids: ['email'],
passwordColumnName: 'password',
})
export default class User extends compose(BaseModel, AuthFinder) {
@column({ isPrimary: true })
declare id: number
@column()
declare fullName: string | null
@column()
declare email: string
@column()
declare password: string
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime
@column.dateTime({ autoCreate: true, autoUpdate: true })
declare updatedAt: DateTime
}

ルートの保護

ガードを設定したら、authミドルウェアを使用して未認証のリクエストからルートを保護できます。ミドルウェアはstart/kernel.tsファイルの名前付きミドルウェアコレクション内に登録されます。

import router from '@adonisjs/core/services/router'
export const middleware = router.named({
auth: () => import('#middleware/auth_middleware')
})
import { middleware } from '#start/kernel'
import router from '@adonisjs/core/services/router'
router
.get('dashboard', ({ auth }) => {
return auth.user
})
.use(middleware.auth({
guards: ['basicAuth']
}))

認証例外の処理

認証ミドルウェアは、ユーザーが認証されていない場合にE_UNAUTHORIZED_ACCESSをスローします。この例外は、レスポンスのWWW-Authenticateヘッダーとともに自動的にHTTPレスポンスに変換されます。WWW-Authenticateは認証を要求し、資格情報の再入力をトリガーします。

認証されたユーザーへのアクセス

auth.userプロパティを使用してログイン済みのユーザーインスタンスにアクセスできます。authミドルウェアを使用しているため、auth.userプロパティは常に利用可能です。

import { middleware } from '#start/kernel'
import router from '@adonisjs/core/services/router'
router
.get('dashboard', ({ auth }) => {
return `あなたは${auth.user!.email}として認証されています`
})
.use(middleware.auth({
guards: ['basicAuth']
}))

認証されたユーザーの取得または失敗

auth.userプロパティに対して非nullアサーション演算子を使用することが好きでない場合は、auth.getUserOrFailメソッドを使用できます。このメソッドはユーザーオブジェクトを返すか、E_UNAUTHORIZED_ACCESS例外をスローします。

import { middleware } from '#start/kernel'
import router from '@adonisjs/core/services/router'
router
.get('dashboard', ({ auth }) => {
const user = auth.getUserOrFail()
return `あなたは${user.email}として認証されています`
})
.use(middleware.auth({
guards: ['basicAuth']
}))