3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Supabase × Claude Codeで初心者が認証付きCRUDアプリを作るまでの設計

3
Posted at

はじめに

プログラミング初心者に「認証付きのWebアプリ」を作ってもらう。これは従来なら中級者向けの課題でした。

しかし、SupabaseのAuth機能とClaude Codeを組み合わせると、初心者でも認証付きCRUDアプリを理解しながら構築できます。

この記事では、初心者向けカリキュラムでSupabase認証を扱う際の設計と、Claude Codeがどう学習をサポートするかを解説します。

なぜSupabaseを選んだのか

初心者に認証を教える選択肢はいくつかあります。

選択肢 メリット デメリット
Firebase Auth ドキュメント豊富 Googleエコシステムへの依存
Auth0 高機能 設定が複雑、初心者には過剰
NextAuth.js Next.js統合 プロバイダー設定の理解が必要
Supabase Auth SQL知識と直結、ダッシュボードで可視化 比較的新しい

Supabase Authを選んだ最大の理由は、データベースと認証が同じ管理画面で見えることです。

初心者にとって「ログインしたユーザーのデータだけを表示する」という概念は抽象的ですが、Supabaseなら管理画面でauth.usersテーブルと自分のテーブルを並べて見られます。

CLAUDE.mdでの学習制御

## 認証セッション(セッション15-16)

### フェーズ: guided(ガイド付き実装)

学習者が認証フローを実装する際の対応ルール:
- signUp/signInの関数は学習者に書かせる
- エラーハンドリングは一緒に考える
- RLS(Row Level Security)の概念はSQL文を見せながら説明
- 「なぜこのポリシーが必要か」を必ず問いかける

ポイントは、Claude Codeに**「答えを教えず、考えさせる」**モードを設定していることです。

実際のコード例

学習者が書く認証コンポーネントの例:

// app/login/page.tsx
'use client'
import { createClient } from '@/utils/supabase/client'
import { useState } from 'react'

export default function LoginPage() {
  const [email, setEmail] = useState('')
  const [password, setPassword] = useState('')
  const supabase = createClient()

  const handleLogin = async () => {
    const { error } = await supabase.auth.signInWithPassword({
      email,
      password,
    })
    if (error) {
      alert(error.message)
    }
  }

  return (
    <div>
      <input value={email} onChange={(e) => setEmail(e.target.value)} />
      <input type="password" value={password} onChange={(e) => setPassword(e.target.value)} />
      <button onClick={handleLogin}>ログイン</button>
    </div>
  )
}

このコードを学習者が書く際、Claude Codeは以下のように振る舞います:

  1. createClientの役割を聞かれたら → Supabaseとの接続を作る関数だと説明
  2. signInWithPasswordのエラーを聞かれたら → よくあるエラー(メール未確認、パスワード不一致)を列挙
  3. 全体を書いてと言われたら → 「まずフォームのUIから書いてみましょう」と段階的に誘導

RLSの教え方

認証の次に難しいのがRLS(Row Level Security)です。

-- 自分のデータだけ見えるポリシー
CREATE POLICY "Users can view own data"
ON todos
FOR SELECT
USING (auth.uid() = user_id);

CLAUDE.mdでは、このSQLを見せた上で「このポリシーがないとどうなる?」と学習者に考えさせるよう指示しています。

「他の人のTodoが見えちゃう」という答えにたどり着くと、RLSの必要性が腹落ちします。

まとめ

  • Supabaseは認証とDBが一体なので初心者の理解が早い
  • Claude Codeの振る舞いをCLAUDE.mdで制御し「教えすぎない」を実現
  • RLSは「なぜ必要か」から入ると定着率が高い

この教材を使ったプログラミング学習サポートをMENTAで提供しています。→ https://menta.work/plan/20251
YouTubeでもAI×プログラミングの情報を発信中 → https://www.youtube.com/channel/UC1rXVD9WYsQPQEWZyd-A1KA/

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?