Next.js で supabase-auth-helpersを使ったログイン時のユーザー情報取得ができなかった時の解決方法

Next.jsとSupabaseを使ってWebアプリを開発している際に、supabase-auth-helpersという認証ヘルパーを使用してログイン認証を実装しようと考えました。
supabase-auth-helpersは、Supabaseを使用したアプリケーションで認証やアクセス制御を簡単に実装するためのライブラリですが、実装時にsignInWithPasswordでログインを実行してもuseUserでユーザー情報が取得できない問題が発生しました。

この記事では、その原因と解決策について説明します。
(ただの凡ミスですが誰か同じ現象に陥っている方がいるかもしれないので備忘録を残しておきます)

原因

問題の原因は、supabase-auth-helpersuseSupabaseClient で定義された supabaseClient を使わず、lib/supabase.ts で定義した supabase を直接使用していたためでした。

次のコードでは、lib/supabase.ts で定義された supabase をインポートし、signInWithPassword を実行しています。

import { supabase } from '@/lib/supabase';

const { data, error } = await supabase.auth.signInWithPassword({
    email: form.email,
    password: form.password,
});

lib/supabase.ts には以下のような定義があります。

import { createClient } from '@supabase/supabase-js';

export const supabase = createClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
);

この定義は、Supabase のクライアントを作成してエクスポートしています。
process.env.NEXT_PUBLIC_SUPABASE_URLprocess.env.NEXT_PUBLIC_SUPABASE_ANON_KEY は、Supabase のプロジェクト設定から取得した API エンドポイントと公開鍵です。これらの値を使って Supabase のクライアントを生成し、アプリケーション全体で使用できるようにしています。

ただ、この方法で生成された supabase クライアントは、supabase-auth-helpers と適切に連携できていないため、signInWithPassword でログインしてもsupabase-auth-helpersが用意している useUserメソッドを使用しても ユーザー情報が取得できません。

解決策

問題を解決するには、useSupabaseClient で定義された supabaseClient を使うように変更します。以下のコードでは、useSupabaseClient をインポートし、signInWithPassword を実行しています。

import { useSupabaseClient } from '@supabase/auth-helpers-react';

const supabaseClient = useSupabaseClient();

const { data, error } = await supabaseClient.auth.signInWithPassword({
    email: form.email,
    password: form.password,
});

この変更により、signInWithPassword でログインした後に useUser でユーザー情報が正しく取得できるようになりました。

useSupabaseClient、supabase-auth-helpersと連携して動作するため、signInWithPassword の実行後に useUser を使ってユーザー情報を取得できます。これにより、ログイン状態を正しく管理し、アプリケーションの認証機能が適切に動作するようになりました。

コメントを残す

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。