Supabase Authとは?ローカルLLM対応AI Overview診断ツールにユーザー認証を追加する

スポンサーリンク
この記事は約11分で読めます。

前回の記事では、ローカルLLM対応のAI Overview診断ツールのDB保存先を、SQLiteからSupabaseに変更しました。

これにより、診断履歴をローカルPC内の dev.db ではなく、クラウド上のSupabase PostgreSQLに保存できるようになりました。

現在の構成は、次の流れとなっています。

AI Overview診断ツール

Next.js API Route

Supabase REST API

Supabase PostgreSQL

前回の実装では、Prismaを使わず、Next.jsのAPI RouteからSupabase REST APIへ直接リクエストして保存する構成にしています。

ただし、現時点ではログイン機能がないため、診断履歴は「誰の履歴か」を区別できません。

そこで今回は、Supabase Authを使ってユーザー認証を追加し、ログインしたユーザーごとに診断履歴を保存できるようにします。

Supabase Authとは?

Supabase Authは、Supabaseが提供している認証機能です。

簡単にいうと、アプリにログイン・新規登録・ログアウトなどの機能を追加できる仕組みです。

Supabase Authはユーザーの作成・管理に使えるSDKやAPIエンドポイントを提供し、パスワード、Magic Link、OTP、ソーシャルログイン、SSOなどに対応しています。

具体的には、Supabase Authでは、次のような認証方法を利用できます。

認証方法内容
メールアドレス + パスワード一般的なログイン方式
Magic Linkメールに届くリンクでログイン
Phone Auth (OTP)SMSを使用した電話番号認証
Social LoginGoogle, GitHub, Facebook, Appleなどでログイン
SAML 2.0(SSO)企業向けのシングルサインオン
Web3ウォレット認証MetaMaskやPhantomといった暗号資産ウォレットを使う

参考:Auth | Supabase Docs

今回のAI Overview診断ツールでは、まず一番分かりやすい メールアドレス + パスワード認証

Supabaseの認証機能

現在の診断履歴保存では、Supabaseの diagnosis_histories テーブルに診断結果を保存できます。

ただし、ログイン機能がない場合、次のような問題があります。

課題内容
誰の履歴か分からない複数ユーザーで使うと履歴が混ざる
自分の履歴だけ表示できない一覧表示時に全ユーザーのデータが対象になる
SaaS化しにくいユーザー単位の管理ができない
セキュリティ面で弱い他人の履歴が見える設計になりやすい

そこで、ログインしたユーザーのIDを user_id として診断履歴に保存します。

現状でも、Supabase側のテーブルには user_id カラムを用意しており、ログイン機能のために利用できるようになっています。

今回の実装では、この user_id にSupabase AuthのユーザーIDを入れるようにしています。

メールアドレス + パスワード認証の基本フロー

ユーザーがアプリにログインする際の動きは、大きく分けて以下のステップで行われます。

1. サインアップ(ユーザー登録)

  1. リクエスト:
    ユーザーがメールアドレスとパスワードを入力して送信。
  2. ハッシュ化:
    Supabaseがパスワードを暗号化(ハッシュ化)します。
  3. 保存:
    管理用テーブルに保存されます。
  4. 確認メール:
    設定が有効であれば、Supabaseから「本人確認メール」が自動送信されます。
    ユーザーがリンクをクリックするまで、アカウントは「保留(unconfirmed)」状態になります。

2. サインイン(ログイン)

  1. 照合:
    送信されたパスワードと、保存されているハッシュ化された値を照合します。
  2. JWT(トークン)の発行:
    認証が成功すると、SupabaseはJWT(JSON Web Token)を発行します。
    • Access Token:
      データベースへのアクセス許可証(短期間で失効)。
    • Refresh Token:
      期限が切れたときに新しいアクセス券をもらうための引換券(長期間有効)。
  3. セッション保持:
    ブラウザの localStorageCookie にこれらのトークンが自動的に保存されます。

セキュリティの仕組み:RLSとの連携

Supabaseの認証が便利なのは、データベースのRow Level Security (RLS) との連携です。

ログインが完了すると、それ以降のデータベースへのリクエストには自動的に「JWT(アクセス権)」が添付されます。
PostgreSQL側では auth.uid() という関数を使って、参照するデータが、ログインしているユーザーのものかを一行ごとに判定できます。

AI Overview診断ツールユーザー認証追加作業

AI Overview診断ツール Supabase Auth追加の流れ

今回のユーザー認証追加の流れとは次の通りです。

  1. Supabase Authを使えるようにする
  2. アプリにログイン画面を追加する
  3. ログイン後だけ診断画面を表示する
  4. 診断APIにログイン確認を追加する
  5. 診断履歴を user_id 付きで保存する
  6. 自分の履歴だけ取得する
  7. 全体ランキングは公開許可されたURLだけ表示する

診断認証管理テーブルの変更

SQL Editorで、診断認証管理テーブル(RLS付)に変更する。

主な変更内容
1. 診断履歴テーブルを作る
2. 既存テーブルにも不足カラムを追加する
3. 検索を速くするインデックスを作る
4. RLSを有効にする
5. 本人だけ読み書きできるポリシーを作る

supabase/schema.sql

Supabase側で Email ログインを有効化

Supabase メールアドレス + パスワード認証の有効化
Authentication->Sign In / Providers

登録確認メールの内容は、Authentication->Email->Confirm sign upから編集できます。

アプリ側では .env.local に以下を追加します。

 ログイン画面を追加

app/page.tsx にログイン / アカウント作成フォームを追加しました。

未ログインの場合は、診断画面ではなくログイン画面を表示します。

未ログイン
→ ログイン画面

ログイン済み
→ 診断画面

ログイン情報を保存

ログインに成功すると、Supabaseからアクセストークンが返ります。
そのトークンをブラウザ側に保存し、診断APIや履歴APIを呼ぶときに Authorization: Bearer <アクセストークン> ヘッダーに付けて送ります。

ユーザー認証の仕組みの流れ

① クライアントがログイン(ID/パスワード送信)
        ↓
② サーバーがアクセストークンを発行・返却
        ↓
③ 以降のリクエストは Authorization: Bearer <トークン> を付けて送信
        ↓
④ サーバーがトークンを検証し、正当なら処理を許可

 API側でログイン確認

追加したlib/supabaseAuth.tsで、ブラウザから送られてきたアクセストークンをSupabase Authに確認します。

Next.js API
→ Supabase Authにトークン確認
→ 正しいユーザーなら処理続行
→ 不正ならエラー

診断実行をログイン必須化

追加したapp/api/analyze/route.tsにより、未ログイン状態では診断実行できないようにしました。

診断履歴をユーザーごとに保存

app/api/history/route.ts で、ログインユーザーのIDを取得し、履歴保存時に user_id として保存します。

diagnosis_histories
- user_id
- created_at
- input_preview
- source_url
- total_score
- summary
- is_public

これにより、誰の診断履歴か分かるようになります。

自分の履歴だけ表示

履歴取得時は、ログイン中の user_id で絞り込みます。
そのため、他のユーザーの履歴は表示されません。

高スコアサイト5選を切り替え

 高スコアサイト5選を切り替え表示

高スコアサイト5選は2種類にしました。

自分だけ
→ 自分の診断履歴から高スコア順に表示

全体
→ 公開許可されたURL診断だけを高スコア順に表示

全体ランキングは、ユーザーがURL診断時に、「全体の高スコアサイト5選に含める」をオンにしたものだけが対象です。

Supabase側のRLS設定

Supabaseでは、データベースの行単位でアクセス制御を行うRLSを使えます。

今回の作業では、supabase/schema.sql にRLS設定を追加しました。

基本方針は以下です。

本人の履歴だけ読める
本人の履歴だけ保存できる
本人の履歴だけ更新・削除できる

これにより、将来的にSaaS化してもユーザーごとのデータ分離を維持しやすくなります。

今回の変更まとめ

次の様に、SaaS化しやすい土台に変えた変更となっています。

ログイン
→ user_id付きで保存
→ 自分の履歴だけ表示
→ 公開許可されたURLだけ全体ランキング表示

まとめ

Supabase Authを使って、AI Overview診断ツールにログイン機能を追加しました。

これに伴いユーザー毎の診断履歴管理が出来るようになったため、高スコア5選の診断履歴表示方法を、自分だけと全体の2パターンで表示できるように改善しました。

関連記事

Codex アプリで作る、ローカルLLM対応のAI Overview診断ツールMVP
Codex アプリを使って、ローカルLLMとルールベース診断で作るAI Overview診断ツールMVPの開発手順を解説。Next.js、TypeScript、Ollamaを使い、本文入力とURL診断に対応した実装内容を紹介します。
SQLite + Prismaとは?ローカルLLM対応AI Overview診断ツールにDB保存機能を追加して分かったこと
SQLite + Prismaを使って、ローカルLLM対応AI Overview診断ツールに診断履歴のDB保存機能を追加する方法を初心者向けに解説。MVPから実用ツールへ拡張する考え方も紹介します。
Supabaseとは?ローカルLLM対応AI Overview診断ツールのDB保存先をSQLiteからSupabaseに変更する
SQLiteで保存していたAI Overview診断ツールのDB保存先をSupabaseへ変更する方法を、初心者向けに分かりやすく解説。Supabaseの基本、REST API連携、PostgreSQL保存の流れ、設定手順、注意点まで紹介します。