Nuxt3でNuxt-Authモジュールを使って認証処理をつくる

shallow focus photography of smartphone NuxtJS
Photo by cottonbro studio on Pexels.com
この記事は約8分で読めます。

以前、以下の投稿で簡易な認証機能を試してみました。しかし、以下は認証フローのイメージを掴むための簡易なサンプルでしたので機能は不十分でした。

Nuxt3での簡易の認証フローを構築する
Nuxt3でアクセストークンを使った簡易な認証フローの構築をしてみます。簡易な認証フローでは、route middlewareを使います。route middlewareはNuxt2にも同様にあった仕組みです。サーバーサイド(SSRサーバ初...

今回は、Nuxt-Authというモジュールを使って認証機能を組み込むための方法について見ていきたいと思います。

環境

  • macOS Catalina (intel cpu)
  • nuxt 3.4.1
  • next-auth 4.22.0
  • @sidebase/nuxt-auth 0.5.0-rc.0
  • Node.js 18.15.0

Nuxt-Authモジュール

Nuxt3にあるNuxt-Authモジュールは、NextAuth.jsというNext.jsアプリケーション用に書かれた認証ライブラリをベースにNuxt3用に提供されているモジュールになっています。nuxt/authという類似名のモジュールがありますが、こちらはNuxt公式でNuxt3にbuilt-inで認証機能を追加するためにNuxt Layersという機能を使って開発されているようですが、まだworkingステータスとなっているようです(本記事執筆時点、まだNuxt2の頃のまま?)。その間は、本記事にあるNuxt-Authモジュールの利用を推奨する、となっています。

Nuxt-Authモジュールは非常に多くの認証プロバイダをサポートしています。NextAuth.jsのサイトを見るとそのサポートの多さが分かります。ユーザの方が使われているだろうサービスプロバイダで困ることはなさそうです。

Nuxt-Authを使ったサンプル

Nuxt-Authモジュールをインストールして認証機能を実装していきたいと思います。今回はGoogleとGitHubプロバイダを使用してみます。

インストール

モジュールのインストールをします。@sidebase/nuxt-authは、0.5.0-rc.0の版となっているようです。

続いてnuxt.configでモジュールの設定をします。以下は、全てのページでデフォルトで認証を有効にする設定をしています。

その他の設定は公式ドキュメントで参照できます。

参考 https://sidebase.io/nuxt-auth/configuration/nuxt-config

認証機能の作成

/api/auth/[...].tsCatch-all Routeにハンドラーの定義を書くようになっています。Catch-all Routeは、リクエストが配下のパスにマッチしない場合にデフォルトで呼ばれるルートです。

参考 https://nuxt.com/docs/guide/directory-structure/pages/#catch-all-route

providersというプロパティに認証プロバイダを設定します。Googleプロバイダを設定した例は以下のようになります。

server/api/auth/[…].ts

providersの配列には複数のプロバイダの設定が可能です。GoogleやGitHubといった複数のプロバイダを設定するとそれらプロバイダを選択できる認証画面が表示されます。GitHubも追加してみましょう。

アプリケーションを起動しhttp://localhost:3000にアクセスすると以下のような認証画面に飛ばされることを確認できます。

app.vue

pages/index.vue

GoogleまたはGitHubを選択できる認証画面です。

認証プロバイダの設定

GoogleとGitHubのプロバイダを登録して実際に設定してみます。callback URLは、デフォルトでは/api/auth/callback/:providerとなっています。

Google

Google API ConsoleからクライアントID、シークレットを取得します。

Google API Consoleへ移動

プロジェクト作成等の詳細は割愛します。

 

GitHub

Developer Settingsに移動

上記の登録を完了し、.envファイルにそれぞれプロバイダのクライアントIDとシークレットを設定しアプリケーションを起動します。アプリケーションの認証画面で認証プロバイダのリンクをクリックすると以下のような認証プロバイダの要求画面が表示されます。

Google GitHub

認証によるページ保護

2つの設定方法があります。1つはサイト全体で保護するグローバル、もう1つはページごとに保護するローカルです。

グローバルで保護

サイト全体で保護する場合は、モジュールのオプションで設定できます。個別のページで認証をかけたくない場合は、definePageMetaで設定することができます。

先ほどの例の通りモジュールのオプションで設定します。

個別のページで認証を要求しない場合は以下のようにします。

ローカルで保護

definePageMeataで設定します。middlewareによって保護されます。

Guest Mode

Guest Modeを使うと、認証済みユーザは認証ページを開かずredirectページに遷移させるといったフローを構築できます。自分で認証済みか否かをチェックすることもできますが、ライブラリ側で制御してくれるのは嬉しいと思います。

カスタム認証ページ

デフォルトで認証画面が用意されているのですぐに始めることができますが、通常はWebサイトのデザインに合わせて画面デザインすることが多いと思います。そのため、個別の認証ページに飛ばすことができます。これはNuxtAhtuHandlerで設定します。

server/api/auth/[…].ts

pages/login.vue

pages/profile.vue

確認してみましょう。

http://localhost:3000/ の認証が必要なページにアクセスします。

ログインページ

ログイン後の/profileページ

Sign Outすると再びログインページに戻ります。

JWTトークンの使用

sessionStrategyをjwtにするとJWTを使えます。

ログインして開発者コンソールでcookieに格納されているsession情報をのぞくと以下のようにJWTの値が入っています。

Credentialsプロバイダ+Sequelizeでのログイン処理

sequelize adapterを使うとデータベースと連携しアカウントやユーザ登録がされるようになります。

sequelize-adapterを使う方法を見ていきます。まずはモジュールをインストールします。データベースはSQLiteを使います。

NuxtAuthHandlerを以下のように修正します。

上記ではモデルの定義をしていません。SequelizeAdapterはモデルがない場合、内部にもつモデル定義からテーブル作成をしてくれます(ただしproduction環境ではない場合)。実際にはsequelizeのsync関数が呼ばれています。production環境では通常マイグレーションする必要があります。

ではこの設定にしてログインしてみましょう。ログインすると以下のようにコンソールにテーブル作成のSQLが出力されるのを確認できます。

ログイン後にテーブルaccounts、users、sessionsを見るとレコードが登録されているのが分かります。

accountsテーブル

usersテーブル

sessionsテーブル

 

CredentialsProviderの使用

CredentialsProviderを使うとusernameとpasswordのような入力を使って既存のシステムを使った認証ができるようです。

EmailProviderの使用

EmailProviderを使うと検証用のトークンを生成した後メール認証リクエストを送信、メール受信者が認証用のURLをクリックしてユーザ登録を完了するというフローを構築できます。認証URLをコンソールに出力したのが以下です。

まとめ

Nuxt-Authモジュールを使うとNuxt3で認証プロバイダを用いた認証機能をクイックに実装することができました。また、アダプタを使うことでデータベースとの連携も簡単に行うことができます。

Nuxt-Authはまだrc版ですが、サクッと導入できプロバイダやアダプタなど機能も豊富でとても使いやすいため、今後Nuxt3でアプリケーション構築していくのに使っていきたいと思いました。

参考リンク

コメント

タイトルとURLをコピーしました