Next.js でログインとダッシュボード付きの Web アプリを作る
メール + パスワードのログインと、自分のデータだけを扱うダッシュボードを Next.js と Supabase(Auth + Postgres + RLS)で作る。
約240分 Claude CodeCursor 検証 2026.10.21
前のチュートリアルでは、WebアプリへDatabaseを追加して、入力したデータを保存できるようにしました。
次は、ユーザー登録・ログイン機能を追加して、「誰が使っているか」を識別できるWebアプリへ進みます。
ユーザー
↓
ログイン
↓
本人確認
↓
Session
↓
そのユーザーのデータだけ取得
↓
画面に表示
ログイン機能が使えるようになると、ユーザーごとのTodo、メモ、予約、顧客データなどを分けて扱えるようになります。
このチュートリアルでは、ログインしたユーザーを識別し、そのユーザーに紐づくデータだけを表示・保存できる構成を理解することを目指します。
認証は、「今アクセスしている人が誰なのか」を確認する仕組みです。
ユーザー
↓
ログイン
↓
本人確認
↓
認証成功
↓
サービスを利用
メールアドレスとパスワードを使う方法だけでなく、Googleなど外部サービスのアカウントを使ってログインする方法もあります。
開発では「認証」と「認可」という言葉が出てきます。
認証
↓
あなたは誰?
認可
↓
あなたはこの操作をしていい?
たとえばログインできたとしても、他人のデータまで編集できてよいわけではありません。
本人確認をしたあと、そのユーザーに許可されたデータ・機能だけ使えるようにする必要があります。
「ログインできる」だけでは安全なアプリとは言えません。「そのユーザーが何を見たり変更したりできるか」まで確認することが重要です。
前回までに作ったアイデア整理アプリへ、次の機能を追加する想定で進めます。
これまで
Idea
↓
全データ
今回
User A
↓
User AのIdea
User B
↓
User BのIdea
認証には複数の方法があります。
初心者が最初に実装する場合は、認証処理をすべて自作するより、現在の技術構成に合った実績のある認証ライブラリやサービスを利用する方が安全です。
現在のプロジェクトを確認してください。
このWebアプリへログイン機能を追加したいです。
まず、
現在の技術構成に合う認証方法を提案してください。
条件:
・認証をゼロから自作しない
・現在もメンテナンスされている方法を優先
・既存のDatabase構成を考慮
・不要な依存関係を増やさない
・セキュリティを優先
まだインストールやコード変更はしないでください。
候補と、それぞれのメリット・注意点を説明してください。
認証はセキュリティに直結する機能です。古い記事やAIの記憶だけを頼らず、利用する認証ライブラリやサービスの現在の公式ドキュメントも確認しましょう。
ユーザーを識別するために、DatabaseへUser情報を持つ構成があります。
シンプルに考えると、たとえば次のような情報です。
User
id
name
email
createdAt
実際に必要なカラムは使用する認証方法によって異なります。
認証ライブラリが必要なテーブルやカラムを自動管理する場合もあります。
これまでのIdeaデータには、「誰が作ったIdeaなのか」という情報がありませんでした。
そこでUserとの関係を持たせます。
User
id: user_1
↓
Idea
id: idea_1
title: AI記事
userId: user_1
これによって、そのIdeaがどのユーザーのものなのか分かるようになります。
User A
├─ Idea 1
├─ Idea 2
└─ Idea 3
User B
├─ Idea 4
└─ Idea 5
ユーザーごとのサービスを作るときは、「データそのもの」だけでなく「そのデータを誰が所有しているか」をDatabaseで管理する考え方が重要です。
認証機能を入れる前に、現在のDatabaseとの関係を整理します。
現在のIdeaアプリへ認証を追加します。
要件:
・ログインユーザーを識別する
・IdeaをUserへ紐付ける
・自分のIdeaだけ表示する
まずDatabase構成を調査してください。
確認:
・現在のIdea Schema
・Userモデルがすでにあるか
・認証関連テーブルの有無
・Ideaへ追加が必要なフィールド
・既存データへの影響
・必要になるMigration
まだSchema変更やMigrationは実行しないでください。
変更案だけ報告してください。
メールアドレスとパスワード方式を採用する場合でも、ユーザーのパスワードをそのままDatabaseへ保存してはいけません。
NG
password = "mypassword123"
↓
Databaseへそのまま保存
一般的には、適切なパスワードハッシュ処理を行う実績のあるライブラリや認証サービスを使います。
パスワード保存やSession管理などの認証処理を、AIに独自方式で一から実装させるのは避けましょう。標準的で実績のある仕組みを利用してください。
認証サービスやOAuthを利用すると、Client ID・Secret・認証用Secretなどの秘密情報が必要になる場合があります。
それらはコードに直接書かず、環境変数として管理します。
AUTH_SECRET=[REDACTED]
GOOGLE_CLIENT_ID=[REDACTED]
GOOGLE_CLIENT_SECRET=[REDACTED]
実際の環境変数名は、利用する認証方法の公式ドキュメントに従います。
認証を追加すると秘密情報が増えるため、Git管理対象を再確認します。
git status
.env や .env.local など秘密情報を含むファイルがGitへ追加されていないか確認します。
秘密情報を含むファイルは、適切に .gitignore へ設定します。
いきなり「認証+Database+Ideaの権限管理」を全部実装するのではなく、小さく進めます。
① ログインできる
↓
② ログアウトできる
↓
③ 現在のユーザーを取得できる
↓
④ IdeaへUserを紐付ける
↓
⑤ 自分のIdeaだけ取得する
最初はログイン・ログアウトだけを完成させます。
認証のような重要な機能ほど、一度に全部変更するのではなく、小さく実装して確認を繰り返しましょう。
認証方法に合わせてログイン画面を用意します。
ログイン画面
↓
Googleでログイン
または
メール
パスワード
↓
ログイン
AIへ依頼するときは、認証ロジックと見た目を同時に大きく変えすぎないようにします。
現在選択した認証方式に合わせて、
ログイン画面を実装してください。
条件:
・既存デザインに合わせる
・スマートフォン対応
・認証ライブラリの公式手順に従う
・独自認証ロジックを追加しない
・関係ない画面を変更しない
実装前に変更予定ファイルを報告してください。
ログイン後、そのユーザーがログイン済みであることをアプリ側で扱うためにSessionという仕組みが使われます。
ログイン
↓
認証成功
↓
Session
↓
「このユーザーはログイン済み」
↓
ページを移動しても状態を確認
Sessionの具体的な実装方式は認証ライブラリによって異なります。
初心者は内部仕様をすべて暗記するより、まず「現在のユーザーを安全に確認する仕組み」と理解すれば十分です。
ログインできたら、アプリ側で現在のユーザーを取得できるか確認します。
現在のSessionを使って、
ログインユーザーを取得してください。
確認したいもの:
・user id
・name
・email
ただし、
秘密情報や認証Tokenを画面へ表示しないでください。
最初は開発環境で、正しいユーザーを取得できているか確認します。
ログインが必要な画面を誰でも開ける状態では意味がありません。
未ログインの場合はログイン画面へ移動させるなど、アクセスを制御します。
Dashboardへアクセス
↓
Session確認
ログイン済み
↓
表示
未ログイン
↓
ログイン画面へ
この処理は画面上でボタンを隠すだけでは不十分です。
「削除ボタンを非表示にしたから安全」とは限りません。
データを取得・変更する処理側でも、現在のユーザーがその操作をしてよいか確認する必要があります。
削除リクエスト
↓
現在のユーザー確認
↓
そのIdeaの所有者か確認
↓
一致
↓
削除
不一致
↓
拒否
画面上で非表示にするだけではアクセス制御になりません。データ取得・更新・削除など重要な処理では、サーバー側でも権限を確認しましょう。
新しいIdeaを作るとき、ログイン中のユーザーIDを一緒に保存します。
ログインユーザー
↓
userId = user_1
Ideaを作成
↓
title
content
userId = user_1
↓
Database保存
これによってIdeaの所有者が分かるようになります。
Idea作成処理を更新してください。
要件:
・ログイン必須
・Sessionから現在のUser IDを取得
・IdeaへUser IDを保存
・ブラウザから送られたUser IDは信用しない
・未ログインの場合は保存しない
既存の保存処理を確認してから変更してください。
ユーザーがブラウザから送る値は変更できる可能性があります。
そのため、
フォーム
userId = user_1
のように送られてきた値をそのまま所有者として扱うのではなく、サーバー側で現在のログインユーザーを確認します。
ブラウザが送ったUser ID
ではなく
↓
Sessionから取得したUser ID
一覧表示するときも、Database内のIdeaをすべて取得してはいけません。
現在ログインしているユーザーのIdeaだけ取得します。
Session
↓
userId = user_1
↓
Database
↓
userId = user_1 のIdeaだけ取得
↓
画面表示
Idea一覧取得処理を変更してください。
要件:
・ログインユーザーをSessionから取得
・そのUser IDに紐づくIdeaだけ取得
・他ユーザーのIdeaを返さない
・未ログインの場合は取得しない
現在のDatabase Queryを確認してから変更してください。
ユーザーごとのデータ分離を確認するには、複数ユーザーで試すのが分かりやすいです。
User A
Idea A1
Idea A2
↓
ログアウト
↓
User B
Idea B1
↓
User Bには
Idea A1 / A2 が見えない
これが確認できれば、基本的なデータ分離が機能しています。
開発用アカウントを2つ用意し、それぞれ別のIdeaを保存してください。その後、相手のIdeaが表示されないことを確認してみましょう。
画面上のリンクからアクセスできないだけでは十分ではありません。
保護したいページのURLを直接入力しても、未ログイン状態で見られないことを確認します。
未ログイン
↓
/dashboard
を直接開く
↓
ログイン画面へ
または
アクセス拒否
ログアウト後も保護ページが見られてしまわないか確認します。
ログイン
↓
Dashboard
↓
ログアウト
↓
Session終了
↓
Dashboardへアクセス
↓
ログインを要求
正常にログインできる場合だけではなく、失敗時の動作も確認します。
利用者に分かりやすいエラー表示になるか確認しましょう。
認証エラーを調査するとき、Token・Cookie・Secretなどをログへそのまま出さないように注意します。
認証Token、Cookie、Secret、パスワードなどをスクリーンショット・ログ・AIへの質問へそのまま貼らないようにしましょう。
Userや認証関連テーブル、Ideaとの関係追加によってDatabase構造が変わる場合があります。
Migrationを実行する前に内容を確認します。
今回のMigrationをレビューしてください。
確認:
・追加されるテーブル
・追加されるカラム
・削除されるもの
・型変更
・既存データへの影響
・本番実行時のリスク
まだMigrationは実行しないでください。
特に既存データがあるアプリでは注意が必要です。
git status
git diff
認証追加では変更ファイルが増えやすいため、要件外の変更がないか確認します。
現在の認証実装をレビューしてください。
確認:
・変更ファイル
・認証処理
・Session処理
・権限確認
・Database変更
・秘密情報
・不要な依存関係
・既存機能への影響
まだ追加修正はしないでください。
利用可能なテストやチェックを実行します。
公開前チェックをしてください。
確認:
・lint
・型チェック
・build
・利用可能なテスト
・ログイン
・ログアウト
・未ログインアクセス
・ユーザーごとのデータ分離
・Database接続
・秘密情報
失敗している項目があれば、
成功とは報告しないでください。
ローカルで設定した認証用環境変数は、GitHubへPushしません。
そのためVercel側にも必要な値を設定します。
Local
.env.local
↓
認証設定
Vercel
Environment Variables
↓
同じ役割の値を設定
PreviewとProductionで別の値を使う場合は、それぞれ正しく設定します。
ローカルで成功しても、公開URLでは認証設定が異なる場合があります。
Preview URLで確認します。
□ ログインできる
□ ログアウトできる
□ Sessionが維持される
□ 未ログイン時は保護ページを見られない
□ 自分のIdeaだけ見える
□ 他ユーザーのIdeaが見えない
□ Idea保存時に正しいUser IDが紐づく
Googleなど外部サービスのログインを使う場合、認証後に戻るURLの設定が必要になることがあります。
ユーザー
↓
Google
↓
認証
↓
Webアプリへ戻る
localhost・Preview・ProductionでURLが異なるため、利用する認証サービスの設定と公式ドキュメントを確認しましょう。
Previewで問題がなければ、現在のGit運用に従って本番へ反映します。
Local
↓
Feature Branch
↓
Preview
↓
認証テスト
↓
Main
↓
Production
↓
本番でも確認
Productionでも最低限、ログイン・ログアウト・データ分離を確認します。
将来的に実サービスとして提供する場合は、ユーザー退会時の処理も考える必要があります。
どの方法が適切かはサービス内容や法的要件によって異なります。
認証とDatabaseを組み合わせることで、作れるサービスの幅がさらに広がります。
認証方法を決める
↓
Userを設計
↓
認証ライブラリを導入
↓
環境変数
↓
ログイン
↓
Session
↓
アクセス制御
↓
IdeaとUserを紐付ける
↓
ユーザーごとに取得
↓
2ユーザーでテスト
↓
Preview
↓
Production
目的:
Webアプリへ認証機能を追加する。
要件:
・ユーザーがログインできる
・ログアウトできる
・Sessionで現在のユーザーを確認
・未ログインユーザーは保護ページへ入れない
・IdeaをUserへ紐付ける
・自分のIdeaだけ表示する
条件:
・認証を独自実装しない
・現在の公式推奨方法を確認する
・既存Database構成を確認する
・秘密情報を表示しない
・関係ないコードを変更しない
・本番Databaseは変更しない
・不要なライブラリを追加しない
最初に現在のプロジェクトを調査してください。
まだコード変更・インストール・Migrationは実行しないでください。
報告:
1. 現在の構成
2. 推奨する認証方法
3. 必要なDatabase変更
4. 必要な環境変数
5. 変更予定ファイル
6. セキュリティ上の注意点
7. テスト方法
8. Productionへの影響
自分が作っているWebアプリをAIへ説明し、「このアプリにログイン機能を追加するとしたら、Userと既存データをどう紐付ける?」と質問して、まずDatabase設計だけ考えてみましょう。
Webサービスを作る
↓
GitHub
↓
Vercel
↓
Database
↓
認証
↓
ユーザーごとのデータ
↓
本格的なWebアプリの基礎
ここまで進めば、単なるWebページではなく、ユーザーごとに情報を保存できるWebアプリの基本構造が見えてきます。
ログイン・Databaseまでできたら、次はWebアプリへAIそのものを組み込みます。
Webサービス
↓
Database
↓
ログイン
↓
AI API
↓
AI機能を持つWebサービス