Remix Authの認証でエラーメッセージを返却する方法
- この記事のポイント
-
- remix-authの基本的な使い方は詳しく触れない
- remix-authで認証失敗時のエラーメッセージを返却する方法を紹介
Remixで認証するならremix-auth便利ですよね!
そんなremix-auth、使っていると困っていることがありました。
それがエラーメッセージってどうやって返却するんだ?ってことです。
認証においてエラーメッセージを返却するというのはよくあるパターンだと思いますが、その実装方法に少しハマってしまいました。
今回はremix-authを使って独自にエラーハンドリングしてメッセージを返却する方法を紹介します。
前提条件
- Remixの基礎的な使い方を理解している
- 認証部分の処理は具体的に紹介しない
今回の記事ではRemixの基礎的な使い方は理解した上で、認証の具体的な実装方法は紹介しません。
Remix Authの公式は下記なので、もしこの記事で触れない不明点がある場合は参考にしてください。
Remix Authの認証部分の設定
まずはremix-authで認証をするための定義を作ります。
ここは独自のエラーレスポンスを返すために特別な設定はしておらず、remix-authを基本的な形で使うためのコードのみです。
上のauthenticatorのインスタンスを作るときのsessionStoreは公式で紹介されているようなコードを想定しています。
https://remix.run/resources/remix-auth#usage
下記コードは公式から引用したコードです。
authencatorの設定ができたら、次はエラーレスポンスを返却するための実装を行います。
remix-authにエラーハンドリングを任せる場合
独自のエラーの前にremix-authを素直に使った場合の実装を見ておきます。
上で設定したuser-passを呼び出すために、authencateメソッドを下記のようにするだけ認証成功、失敗の処理が完結します。
とても短くて簡潔ですが、困るのが認証失敗時のエラーメッセージの表示です。
たとえば認証に失敗したら「メールアドレスとパスワードが一致しません」というようなメッセージを表示するケースはよくあると思いますが、remix-authを素直に使うとそのようなエラーメッセージを表示することができません。
remix-authでは認証の成功でも失敗でも設定したリダイレクト先にリダイレクトされてしまいます。
独自のエラーレスポンスを定義する
remix-authを素直に使うと任意のエラーメッセージを表示することができないので、独自のエラーレスポンスを返却するための実装を行います。 まずはremix-authのauthenticateメソッドを使って認証処理を実装。
これで
- 成功時: catchでstatusが302のResponseをハンドリング
- 失敗時: authenticateのuser-pass内部でthrowしたErrorをハンドリング
authenticateのuser-passで呼び出している内部でエラーをthrowすることで、失敗時に@remix-run/nodeのjsonメソッドを使ってエラーレスポンスを返却することができます。
注意点として公式にも明記されていますが、リダイレクトはResponseを返却することで動作しているので成功時においても、catchでハンドリグが必要です。
actionで返却したデータを使ってエラーメッセージを表示する
後はactionで返却したデータを使ってエラーメッセージを表示するだけです。
今回紹介しているコードでは@remix-run/nodeのjsonメソッドを使ってuseActionDataで取得するとdataはanyになります。 そのためasを使って型を指定しています。
型の情報を取得しやすいremix-typedjsonを使ってもResponse型であれば取得できますが、{ message: string}
の型は得られなかったので今回は純粋に@remix-run/nodeのjsonメソッドを使っています。
useActionDataでの型については「RemixのuseLoaderDataのJsonifyObject型に対しての対応方法」で書いたようにremix-typedjsonが使いやすいので使用を検討するのも良いと思います。
まとめ
Remix Authは面倒な認証処理がシンプルに行えますが、どうやって独自にエラーハンドリングするのが良いか悩んだので紹介してみました。
認証に失敗したらいきなりリダイレクトするという仕様はあまりないように思うので、もしremix-authでエラーメッセージを表示する方法を探している方の参考になれば幸いです。