📑

Auth.jsを使って認証機能を実装する備忘録

2023/07/25に公開

はじめに

Auth.jsを使って認証機能の実装を試したので備忘録として残す。
https://github.com/Gyabi/nextauth-prisma-sample

環境

  • Next.js(App router)
  • Auth.js
  • Prisma
  • docker compose(Nextjsとpostgresのコンテナを起動)

補足:

  • Prismaを用いることでセッションをDBに保存します。デフォルトだとjwtになります。

ステップ

プロジェクト作成

npx create-next-app@latest <projectname> --example with-tailwindcss

Prisma導入

※DBの生成自体はdocker composeに記載しておいたので省略。コンテナを立てるだけでpostgresの準備は完了する。

インストールと初期設定

npm install prisma -dev
npx prisma init

スキーマの定義

https://authjs.dev/reference/adapter/prisma
上記に従ってprismaのスキーマを定義する。
https://github.com/Gyabi/nextauth-prisma-sample/blob/main/app/prisma/schema.prisma

DBとの接続

npx prisma migrate dev --name init

上記コマンドをたたく前に.envへDATABASE_URLを指定しておく必要がある。
https://github.com/Gyabi/nextauth-prisma-sample/blob/main/app/.env.sample

Prisma Studioの起動

以下のコマンドでGUI上でDBを操作できるようになる。

npx prisma studio

Prismaのクライアントコードの記述

https://github.com/Gyabi/nextauth-prisma-sample/blob/main/app/lib/prisma.ts

Auth.js導入

設定

/app/api/auth/[...nextauth]/route.tsを作成します。
https://github.com/Gyabi/nextauth-prisma-sample/blob/main/app/app/api/auth/[...nextauth]/route.ts
補足:

  • App routerを利用しているためapp/apiフォルダ以下がAPI routesの対象になります。(nextjsの機能でバックエンドAPIを実装できる特殊なフォルダ)
  • その他動作にはいくつかファイルが必要です。詳しくはgithubを見ること。

サインインとサインアウト

サインインとサインアウトはそれぞれsignIn()、signOut()を実行することで可能。
自動的に/api/auth/signinと/api/auth/signoutにアクセスする。
アクセスするとAuth.jsが自動的に作成している認証ページへ転送される。
https://github.com/Gyabi/nextauth-prisma-sample/blob/main/app/app/signin/page.tsx
https://github.com/Gyabi/nextauth-prisma-sample/blob/main/app/app/signout/page.tsx

サーバコンポーネントでのセッション情報取得

サーバコンポーネントでセッションを取得するときにはgetServerSessionというメソッドを利用する。引数にはAuth.js自体の設定で使ったoptionを入れる。
サンプルは以下。
https://github.com/Gyabi/nextauth-prisma-sample/blob/main/app/app/sample/page.tsx

クライアントコンポーネントでのセッション情報取得

useSessionの利用には配置するタグ構造の上位にSessionProviderというタグが入っている必要がある。
そこで、以下のようなコンポーネントを作ってlayout.tsxにて設定しておく。
https://github.com/Gyabi/nextauth-prisma-sample/blob/main/app/components/NextAuthProvider.tsx

上記を作ったらあとはuseSessionを使うだけ。勝手にセッション情報をフックしてくれる。
上記NextAuthProvider内でuseSessionは使っているので割愛。

参考

https://zenn.dev/farstep/books/7a6eb67dd3bf1f/viewer/ba0cb7
https://zenn.dev/tfutada/articles/5557b780050574#サーバー・コンポーネント

Discussion