Laravel+Sanctum+FortifyとNuxt.js+nuxt/authでSPAの認証処理を実装する【ユーザー情報登録編】

前回まででログイン・ログアウト処理が実装できたので、今回はユーザー登録処理を実装していきます。

ユーザー登録処理の実装

ユーザー登録ページの作成

pagesディレクトリにregister.vueという名前でファイルを作り、適当にユーザー登録用のフォームを作ります。こんな感じに作ってみました。 29行目の様にregisterに必要情報をpostするだけです。

見た目はこんな感じになります。(ラベルぐらい設定しておけば良かった)

config/cors.phpのpathsに'register'を追加します。

テスト実行

このままregisterを試してみます。するとregisterメソッドで「CSRF token mismatch.」とエラーが返ってきます。Laravel Sanctumを導入したことでregister APIの実行時にもCSRF保護をしてくれるようになっている訳ですが、CSRF tokenを持っていないのでエラーが発生しています。

CSRF保護対策

以下によると/sanctum/csrf-cookieにGETリクエストを投げる必要があり、その後はaxiosが自動でやってくれるらしいのでそのように修正します。

SPAを認証するには、SPAの「ログイン」ページで最初に/sanctum/csrf-cookieエンドポイントにリクエストを送信して、アプリケーションのCSRF保護を初期化する必要があります。

https://readouble.com/laravel/8.x/ja/sanctum.html#csrf-protection

具体的には以下コードの様に29行目を追加します。

余談ですがnuxt.config.jsでaxiosの設定にcredentialsの設定が漏れていて、この処理が動かずハマりました。

認証済みのリダイレクト対策

registerするとLaravel側ではログインしたことになるようなのですが、Nuxt.js側ではまだログイン処理していないのでregister直後にそのままloginも実行するようにします。

具体的には以下コードの様に31-33行目を追加します。

この状態で登録処理を実行するとloginメソッドから/homeにリダイレクトされてしまいます。

app\Http\Middleware\RedirectIfAuthenticated.phpの中でクライアントが認証済みの場合はRouteServiceProvider::HOMEへリダイレクトするように書かれているせいなのですが、ちょっと困るので適当にユーザー情報でも返すことにしておきます。

具体的には以下コードの様に27-29行目を追加します。

最後に

ユーザー登録した直後にログインしてしまう仕様は普通なのかな?とちょっと疑問に思いました。あんまり込み入ったことはしたくないのでそれ前提で作っていこうと思います。 次回はメール認証機能を実装してみようと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です