Next.jsとSupabaseAuthとRLSを組み合わせるときはAPIrouteは使用できない

記事
IT・テクノロジー

はじめに

Next.jsとSupabaseの認証機能を連携させる際、特に行レベルセキュリティ(RLS)を活用する場合、APIルートの使用は技術的な制約によって推奨されません。本記事では、Supabase SSRライブラリを使用した正しい実装方法について、サーバーコンポーネントでのSupabaseクライアントの使用方法に焦点を当てて解説します。

Supabase SSRライブラリの概要

2023年後半に導入された「supabase/ssr」は、Next.jsのApp Routerとの統合を強化した新しいパッケージです。従来の認証ヘルパーライブラリに代わるものとして、より一貫性のある認証体験を提供します。
このパッケージは、サーバーコンポーネント用のクライアント生成関数、クライアントコンポーネント用の関数、そしてミドルウェア用のセッション更新機能を提供しています。

サーバーコンポーネントでのクライアント初期化の重要性

サーバーコンポーネントでSupabaseクライアントを初期化する際は、Next.jsのクッキーAPIを活用して認証情報にアクセスすることが重要です。サーバーコンポーネント用のクライアント生成関数には、クッキーの読み取りと設定のための機能を含める必要があります。
この設定により、クライアントは認証情報を含むクッキーを読み取り、認証済みリクエストを送信できるようになります。また、認証情報の更新時にはクッキーを適切に設定することも可能になります。

サーバーコンポーネントでの認証とデータアクセス

サーバーコンポーネントでSupabaseを使用する際の基本的な流れは以下の通りです:
① サーバー用のSupabaseクライアントを初期化します。
② 「getUser」メソッドを呼び出して現在のユーザー情報を取得します。この手順は非常に重要です。
③ ユーザーが認証されていない場合はログインページなどにリダイレクトします。
④ 認証されたユーザーのIDを使用してRLSで保護されたデータにアクセスします。

ここで重要なのは、必ず「getUser」メソッドを使用してユーザー認証を確認することです。「getSession」メソッドは信頼性が低いため避けるべきです。

ミドルウェアの役割と重要性

Supabase SSRライブラリを正しく機能させるには、ミドルウェアの設定が不可欠です。ミドルウェアの主な役割は以下の通りです:

認証トークンの自動更新:期限切れのトークンを検出し、更新します。
サーバーコンポーネントへの認証情報の橋渡し:認証状態をサーバーコンポーネントに伝達します。
ブラウザとサーバー間の認証状態の同期:一貫した認証体験を提供します。

適切に設定されたミドルウェアがなければ、認証トークンの更新や認証状態の維持が困難になり、ユーザー体験に悪影響を及ぼす可能性があります。

APIルートが使用できない理由

次に、APIルートがSupabaseのRLSと相性が悪い理由について説明します:

認証コンテキストの分離:APIルートは独立したサーバーサイド環境で実行されるため、ブラウザに保存された認証情報(クッキー)へのアクセスが制限されています。
セッション管理の複雑さ:APIルートで認証情報を正しく処理するには、ミドルウェアが自動的に行っている処理を手動で実装する必要があります。
RLSポリシーの効果:APIルートからSupabaseにリクエストを送る場合、認証情報が正しく付与されなければ、RLSポリシーによってデータアクセスが制限されます。

これらの問題により、APIルートを使用したアプローチは複雑さが増し、エラーが発生しやすくなります。

実装のベストプラクティス

Supabase SSRを使った実装のベストプラクティスは以下の通りです:

必ずミドルウェアを設定する:認証トークンの更新と同期を正しく行うために、ミドルウェアは必須です。
認証チェックには「getUser」を使用する:サーバーコンポーネントでユーザーの認証状態を確認する際は、必ず「getUser」メソッドを使用してください。
データアクセスの前にユーザー確認を行う:保護されたデータにアクセスする前に、ユーザーの認証状態を必ず確認してください。
クライアントとサーバーのコードを明確に分ける:クライアントコンポーネントとサーバーコンポーネントでは、それぞれ専用のSupabaseクライアント初期化関数を使用してください。
サーバーアクションを活用する:データの作成や更新などの操作は、サーバーアクションを通じて行うことで、セキュリティとパフォーマンスを向上させることができます。

まとめ

Next.jsとSupabase SSRを組み合わせる場合、APIルートの代わりにサーバーコンポーネントとサーバーアクションを使用することで、RLSによる行レベルセキュリティを正しく機能させることができます。
新しいSupabase SSRパッケージは、より一貫性のある認証体験を提供し、ミドルウェア、サーバーコンポーネント、クライアントコンポーネントの間で認証状態を適切に同期します。
この実装方法に従うことで、セキュアで効率的なNext.js+Supabaseアプリケーションを構築することができます。特に、Supabaseクライアントをサーバーコンポーネントで使用する際は、必ずクッキーを適切に設定し、ユーザー認証の確認には「getUser」メソッドを使用することを忘れないでください。
安全で効率的なWebアプリケーション開発に、ぜひこの知識をお役立てください。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す