🍈
React × TypeScript × Viteでの認証管理!AuthContextでログイン状態を管理
はじめに
- React + TypeScript + Vite で開発を進める中で、認証やルーティングの設計に悩んだので、この記事にまとめました。
- AuthContext を使った認証の管理
- React Router との組み合わせ方
- コンポーネントの順番を意識した設計
プロジェクト構成
AuthContext.tsx
やルーティング関連のファイルを整理
├─ src
├─ components
│ ├─ layout
│ ├─ Layout.tsx # 共通のレイアウト
├─ contexts
│ ├─ AuthContext.tsx # 認証管理
├─ router
│ ├─ index.tsx # ルーティング設定
├─ main.tsx # ルートコンポーネント
├─ App.tsx # アプリのエントリーポイント
AuthContext.tsx
の実装
認証状態を管理するAuthContext
を作成し、AuthProvider
でアプリ全体に認証情報を提供します。
-
createContext
で認証の状態を定義-
createContext
を使用し、アプリ全体で共有する認証状態(isAuthenticated)とログイン・ログアウト関数を定義
⇨createContext
を使用することで、どのコンポーネントからでもAuthContext
を通じて認証状態を取得
-
const AuthContext = createContext<AuthContextType | undefined>(undefined);
-
AuthProvider
を作成-
useState
を使用し、isAuthenticated(ログイン状態)
を管理し、
AuthContext.Provider
を子コンポーネントに認証情報
⇨AuthProvider
にて、どのコンポーネントからでもuseAuth()
を使用し認証状態を取得
⇨login()
/logout()
で、簡単にログイン状態を変更
-
export function AuthProvider({ children }: { children: ReactNode }) {
const [isAuthenticated, setIsAuthenticated] = useState(false);
const login = () => setIsAuthenticated(true);
const logout = () => setIsAuthenticated(false);
return (
<AuthContext.Provider value={{ isAuthenticated, login, logout }}>
{children}
</AuthContext.Provider>
);
}
useAuth()
で認証情報を取得
useAuth()
を作成し、認証状態を取得できるようにします。
export function useAuth() {
const context = useContext(AuthContext);
if (!context) throw new Error("useAuth must be used within an AuthProvider");
return context;
}
main.tsx
でAuthProvider
を適用
AuthProvider
をmain.tsx
に組み込み、アプリ全体で認証情報を管理します。
-
AuthProvider
はBrowserRouter
の外側に配置(ルーティング内でuseAuth()
を使用可能)
<AuthProvider>
<BrowserRouter>
<App />
</BrowserRouter>
</AuthProvider>
App.tsx の構成
共通レイアウト Layout.tsx を適用し、その中に AppRouter を組み込みます。
- この順番にすることで、すべてのページに共通のヘッダー・フッターを適用
<Layout>
<AppRouter />
</Layout>
main.tsx
のコンポーネントの順番
コンポーネントの順番の説明です。
順番 | コンポーネント | 役割 | 位置の理由 |
---|---|---|---|
1 | StrictMode |
開発時のエラー検出 | 最も外側でReact のチェック機能が有効 |
2 | AuthProvider |
認証状態を提供 |
BrowserRouter の前に置くことで、ルーティング内でuseAuth() が使用可能 |
3 | BrowserRouter |
ルーティングを管理 |
App を囲むことで、Route の動作有効 |
4 | App |
アプリ全体の管理 |
Layout やAppRouter を統括 |
Discussion