第181章:ログアウトを作る🚪✨
この章では、「ログアウト」ボタンを押したら セッションを消して、**指定ページへ移動(リダイレクト)**できるようにするよ〜!🙌💕
ゴール🎯
- ✅ ログアウトボタンを作る🚪
- ✅ 押したらサインアウト(セッション破棄)される🧹
- ✅ ログアウト後にトップ(例:/)へ戻す🏠
ログアウトって何してるの?🤔
ざっくり言うと…
- ログイン状態を表す情報(Cookie/セッション)を無効化して🧯
- 「もうログインしてないよ」状態に戻す🌙
Auth.js(NextAuth v5系)だと、サインアウトは signOut() を呼ぶだけでOKな設計になってるよ🧸✨(セッション方式によって、DBのセッション削除 or Cookie無効化などが行われるよ)(Zenn)
図解:ログアウトの流れ🧠➡️🚪
いちばんシンプルな実装(おすすめ)💡
Next.js(App Router)なら、Server Action + form がスッキリでおすすめだよ〜!🧡 Auth.js公式でも「form action で signOut」例が載ってる✨(Auth.js)
1) ログアウトボタンコンポーネントを作る🧩
ファイルを作成👇 components/auth/SignOutButton.tsx
// components/auth/SignOutButton.tsx
import { signOut } from "@/auth";
export function SignOutButton() {
return (
<form
action={async () => {
"use server";
await signOut({ redirectTo: "/" }); // 好きな行き先に変えてOK🏠
}}
>
<button type="submit">ログアウト🚪</button>
</form>
);
}
ポイント💖
- "use server" があるので、この中はサーバーで動くよ☁️
- redirectTo を指定すると、ログアウト後の移動先を変えられるよ🏃♀️💨(nextjs.im)
2) ヘッダーやナビに置く(例)🧷
たとえば app/layout.tsx やヘッダーコンポーネント(Server Component)から呼ぶ感じ✨
// 例: app/layout.tsx(またはヘッダーのServer Component)
import Link from "next/link";
import { auth } from "@/auth";
import { SignOutButton } from "@/components/auth/SignOutButton";
export default async function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const session = await auth();
return (
<html lang="ja">
<body>
<header style={{ display: "flex", gap: 12, padding: 12 }}>
<Link href="/">Home🏠</Link>
{session?.user ? (
<SignOutButton />
) : (
<Link href="/login">ログイン🔑</Link>
)}
</header>
{children}
</body>
</html>
);
}
「ログインしてる時だけログアウトボタン出す」っていう自然なUIになるよ😊✨ (auth() を Server Component で呼ぶのも Auth.js の基本パターンだよ)(Auth.js)
動作チェック✅
- 開発サーバー起動🏃♀️
- ログイン状態にする🔑
- 「ログアウト🚪」押す
- トップ(/)に戻って、ログアウト状態になってたら成功🎉✨
よくあるハマり💥(ここだけ注意!)
- **SignOutButton.tsx に "use client" を付けない!**🙅♀️ Server Action(form action)はサーバー側の仕組みだから、混ぜると事故りやすいよ〜🧯(Zenn)
- ボタンは type="submit" にする🖱️
- ログアウト後の移動先を変えたいなら redirectTo を使う🏠(nextjs.im)
おまけ:クライアント側でログアウトする方法(知識として)📌
「ボタン押したら signOut()」のクライアント版もあるよ〜(ただしバンドル増えがち)🎮 公式ページでも例がある✨(Auth.js)
"use client";
import { signOut } from "next-auth/react";
export function SignOutButtonClient() {
return <button onClick={() => signOut()}>ログアウト🚪</button>;
}
ミニ練習🌸
- ✅ redirectTo を /login に変えてみよう🔁
- ✅ ボタン文言を「またね👋」にしてみよう😊
以上で「ログアウトを作る🚪」は完成だよ〜!🎉💖