認証情報プロバイダ
認証情報プロバイダを使用すると、ユーザー名とパスワード、ドメイン、2要素認証、またはハードウェアデバイス(例:YubiKey U2F/FIDO)などの任意の認証情報を使用したサインイン処理を行うことができます。
これは、既存のシステムに対してユーザー認証を行う必要があるユースケースをサポートすることを目的としており、そのため、この方法で認証されたユーザーはデータベースに永続化されません。
リソース
設定
/auth.ts
import NextAuth from "next-auth"
import Credentials from "next-auth/providers/credentials"
export const { signIn, signOut, auth } = NextAuth({
providers: [
Credentials({
credentials: {
username: { label: "Username" },
password: { label: "Password", type: "password" },
},
async authorize({ request }) {
const response = await fetch(request)
if (!response.ok) return null
return (await response.json()) ?? null
},
}),
],
})
カスタムエラーメッセージ
authorize
関数でカスタムエラーをスローして、ユーザーにカスタムエラーメッセージを返すことができます。
@/auth.ts
import NextAuth, { CredentialsSignin } from "next-auth"
import Credentials from "next-auth/providers/credentials"
class InvalidLoginError extends CredentialsSignin {
code = "Invalid identifier or password"
}
export const { handlers, auth } = NextAuth({
providers: [
Credentials({
credentials: {
username: { label: "Username" },
password: { label: "Password", type: "password" },
},
async authorize(credentials) {
throw new InvalidLoginError()
},
}),
],
})
その後、ログイン試行失敗後にユーザーが戻るサインインページのクエリパラメータで、そのカスタムエラーコードを受け取ります。例:https://app.company.com/auth/signin?error=CredentialsSignin&code=Invalid+identifier+or+password
。
⚠️
OAuth プロバイダは、多大な費用、時間、エンジニアリングリソースを費やして構築しています。
- 不正利用検出(ボット対策、レート制限)
- パスワード管理(パスワードリセット、資格情報詰め込み攻撃、ローテーション)
- データセキュリティ(暗号化/ソルト化、強度検証)
認証ソリューションには他にも多くの機能があります。これらの実績のあるソリューションを活用することで、アプリケーションのメリットが得られる可能性が高く、ゼロから再構築しようとするよりも効果的です。
これらのリスクにもかかわらず、パスワードベースの認証をアプリケーションに構築したい場合は、Auth.js を使用することで完全な制御が可能です。