t0mmy
学習履歴詳細
実践Next.js 7章 認証機能 読了
やったこと
- 実践Next.js 7章 認証機能 読了
学んだこと
Next.js で、クレデンシャル情報を環境変数へ設定する
想定するクレデンシャル: DB サーバーのログイン情報や、API の認証情報
基本は以下の通り。
.envといった隠れファイルに、環境変数をまとめる- web アプリケーションではおなじみの名前とのこと
.gitignoreに、環境変数をまとめたファイルのファイル名を記述し、git 管理下から外す
Next.js では、以下のファイルを自動で読み込んでくれる。
.env: 常時読み込む.env.$(NODE_ENV): 該当の NODE_ENV の値が有効な場合に読み込む.env.local: ローカル開発環境で常時読み込む.env.$(NODE_ENV).local: 開発環境にて、該当の NODE_ENV の値が有効な場合に読み込む
$(NODE_ENV) の有効な値は、 production, development, test の 3 つ。
なお、 Next.js 以外だと、dotenv 等のライブラリを利用することになる。
なお、環境変数ファイルは、以下の順で読み込まれる。
.env.development.local.env.local.env.development.env
既に存在している環境変数は上書きされない。
つまり、環境変数が重複していた場合、優先順位の高いファイルの値が設定されることになる。
環境変数の公開範囲
◆public な環境変数
NEXT_PUBLIC というプレフィックスが付く環境変数のこと。
この環境変数は、ビルド時にインライン化される。
値を変えるには再ビルドが必要。
◆private な環境変数
NEXT_PUBLIC というプレフィックスを持たない環境変数のこと。
private な環境変数は、(client component に直書きしたなどで)誤ってインライン化しようとした場合、空文字で置き換えてくれる。
NextAuth.js の導入
NextAuth.js の導入手順
- 環境変数
NEXTAUTH_SECRETの設定 - Middleware の設置
- NextAuthOptions の設定
- Route Handler の設置
- getServerSession の利用
環境変数 NEXTAUTH_SECRET の設定
OAuth 認証用 にシークレットキーを作成し、NextAuth.js に読み込ませる。
シークレットキーは、 openssl コマンドなどで生成する。
openssl rand -base64 32
参考 : https://next-auth.js.org/configuration/options#nextauth_secret
生成したシークレットキーは、.env 系統の環境変数ファイルに、 NEXTAUTH_SECRET という名前の変数で定義する。
あとは、 NextAuth.js が、 NEXTAUTH_SECRET 環境変数を自動で判別し、読み込んでくれる。
Middleware の設置
Middleware は、「リクエストを処理する前に実行したいコード」を定義できる機能。
ユースケース : レスポンスヘッダの書き換えやリダイレクト
NextAuth.js では Middleware を活用して、
特定のURLパターンにマッチするRoute を「認証が必要なRoute」としてハンドリングする
といったことが可能。
export { default } from "next-auth/middleware";
export const config = {
matcher:["/profile"],
}
NextAuthOptions の設定
NextAuth.js の設定をカスタムする。
NextAuthOptions インターフェースに沿ったJSONを定義し、 export して使用する。
NextAuthOptions インターフェースの主要なオプションは以下の通り。
adapter? : Adapter- 他のサービス(ORMなど)と連携する場合に使用する、アダプター
providers : Provider[]- OAuth プロバイダー情報。
- Google なら、
GoogleProviderオブジェクト。
callbacks? : Partial<CallbacksOptions>- OAuth 認証成功後に呼び出したい、コールバック関数を定義できる
- OAuth 認証後は
jwtを取得できるので、これを起点に後続処理を記述していく
◆ ◇ ◆ ◇ ◆ ◇ ◆ ◇ ◆ ◇ ◆ ◇
Prismaと接続する場合は、 PrismaAdapter を使用する。
参考 : https://next-auth.js.org/v3/adapters/prisma
Route Handler の設置
NextAuth.js 専用の Route Handlerが存在するため、これに沿って handler 関数を定義する。
// api/auth/[...nextauth]/route.ts
import NextAuth from "next-auth"
import { authOptions } from "NextAuthOptions を定義したファイル"
const handler = NextAuth(authOptions)
export { handler as GET, handler as POST }
参考 : https://next-auth.js.org/configuration/initialization#route-handlers-app
getServerSession の利用
サーバーサイド側で getServerSession 関数を使用すると、ログインユーザー情報を参照できる。
import { getServerSession } from "next-auth"
import { authOptions } from "NextAuthOptions を定義したファイル"
...{
const session = await getServerSession(authOptions)
...
}
参考 : https://next-auth.js.org/configuration/nextjs#getserversession
関連ドキュメント
NextAuth.js 公式: https://next-auth.js.org/getting-started/introduction
Middleware 公式 : https://nextjs.org/docs/app/building-your-application/routing/middleware
2024年06月01日(土)
2.0時間