Contents
ReactアプリにAuth0 Universal Loginを導入する理由と本記事の流れ
Reactアプリでセキュアなユーザー認証を構築する際、Auth0のUniversal Loginは開発効率を大きく高める選択肢です。既存のUIを変更せずに簡潔なフローで認証処理が可能であり、特にSPA(シングルページアプリ)向けに最適化されています。本記事では、公式ドキュメントと連動しながら具体的な手順とコード例を解説し、実装時のエラー対策も別途セクションで紹介します。
Auth0アカウント登録とアプリケーション設定
ReactアプリにAuth0 Universal Loginを導入するためには、まずAuth0アカウントの準備が必要です。管理画面での基本的な設定からCallback URLの登録までをステップごとに解説します。
Auth0管理者ダッシュボードへのアクセス方法
- https://auth0.com にアクセスし、無料アカウントを作成します。
- アカウント作成後、「Applications」タブから「Create Application」を選択します。
- Application typeは「Single Page Web Applications」を指定し、アプリ名を入力して作成します。
重要: ローカル開発環境でテストする場合は、Callback URLに
http://localhost:3000などを登録してください。
Reactアプリ向けのClient ID・Secret取得手順
- アプリケーション詳細ページを開き、「Settings」タブをクリックします。
- Client IDとClient Secretをコピーしておきます(後でReactプロジェクトに使用します)。
- 「Allowed Callback URLs」に
http://localhost:3000/auth/callbackなど、アプリケーションがリダイレクトするURLを追加します。
| 項目 | 値 | 補足 |
|---|---|---|
| Client ID | YOUR_CLIENT_ID |
リアクティブなセキュリティ対策で定期的に変更される可能性あり |
| Client Secret | YOUR_SECRET |
サーバーサイドで使用し、クライアントサイドでは絶対に公開しない |
auth0-reactライブラリの導入と初期設定
Auth0 React SDK(auth0-react.js)をインストールすることで、Reactアプリケーション内で認証フローを実装できます。
npm/yarnによるパッケージインストール
|
1 2 3 4 |
npm install @auth0/auth0-react # または yarn add @auth0/auth0-react |
TypeScript環境の場合は、
@types/auth0-auth0-reactをインストールしてください(公式は提供していないため、DefinitelyTyped経由で利用可能です)。
Auth0Clientの基本構成ファイル作成
プロジェクトルートにauth0Config.js(または.ts)を作成し、以下のように設定します。
|
1 2 3 4 |
// src/auth0Config.js export const AUTH0_DOMAIN = 'YOUR_AUTH0_DOMAIN'; export const AUTH0_CLIENT_ID = 'YOUR_CLIENT_ID'; |
注意: 実際の開発では環境変数で管理するのが推奨されます(
.envファイルやVercel/Netlifyなどの設定に組み込み)。以下のように設定してください。
環境変数管理の具体的な手順
Reactプロジェクトでは、環境変数を.envファイルで管理することでセキュリティと柔軟性が向上します。
.envファイルの作成と設定
- プロジェクトルートに
.env.localファイルを作成します。 - 以下のように環境変数を記述します。
|
1 2 3 |
VITE_AUTH0_DOMAIN=YOUR_AUTH0_DOMAIN VITE_AUTH0_CLIENT_ID=YOUR_CLIENT_ID |
注意: 本番環境では
.env.productionを使用し、クライアントシークレットなどはサーバーサイドで管理する必要があります。
環境変数の読み込み方法(React + Vite)
import.meta.env.VITE_AUTH0_DOMAINのようにアクセスします。- ブラウザに環境変数が露出しないよう、名前の前につけるプレフィックスは
VITE_を推奨します。
Universal Loginフローのトリガー実装
認証ボタンコンポーネントを作成し、useAuth0フックを用いてログイン処理を呼び出します。UI側のイベントハンドラとauth0-reactのAPI連携方法をコード付きで解説。
認証ボタンコンポーネントの作成
src/components/LoginButton.jsを作成し、以下のように実装します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import { useAuth0 } from '@auth0/auth0-react'; function LoginButton() { const { loginWithRedirect } = useAuth0(); return ( <button onClick={loginWithRedirect}> ログイン </button> ); } export default LoginButton; |
useAuth0フックによるログイン処理の呼び出し
App.jsなどにログインボタンを配置し、イベントハンドラを設定します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import React from 'react'; import LoginButton from './components/LoginButton'; function App() { return ( <div> <h1>Reactアプリ</h1> <LoginButton /> </div> ); } export default App; |
認証後のユーザー情報取得とセキュリティ対策
ログイン成功後は、認証情報を安全に取り扱い、トークン検証ロジックを実装します。
ユーザー情報の取得タイミング
useAuth0()フックのuserプロパティで、認証済みユーザー情報を取得できます。ただし、ローカルストレージのデータだけでは信頼性が保証されませんので、サーバーサイドでもトークン検証が必要です。
トークン検証ロジックの実装例(クライアントサイド)
以下のようにID Tokenを検証し、有効期限を確認します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import { useAuth0 } from '@auth0/auth0-react'; function ProtectedContent() { const { user, isAuthenticated, isLoading } = useAuth0(); if (isLoading) return <div>読み込み中...</div>; if (!isAuthenticated) return <div>ログインが必要です</div>; return ( <div> <h2>{user.name}さん、ようこそ!</h2> </div> ); } |
サーバーサイドでのトークン検証ロジック(Node.js例)
以下のようにID Tokenを検証し、有効期限や署名の正当性を確認します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import jwt from 'jsonwebtoken'; const verifyToken = (token: string) => { try { const decoded = jwt.verify(token, process.env.AUTH0_SECRET, { audience: process.env.AUTH0_AUDIENCE, issuer: `https://${process.env.AUTH0_DOMAIN}/`, algorithms: ['RS256'], }); return decoded; } catch (error) { console.error('Token validation failed:', error); throw new Error('Invalid token'); } }; |
重要なベストプラクティス: ID Tokenの検証はサーバーサイドで必ず実施してください(クライアントサイドでは偽装が可能です)。
認証状態のグローバル管理(Context API編)
複数コンポーネント間での認証情報共有には、Context APIを活用します。カスタムフックとProviderで簡潔に実装できます。
Auth0Clientのインスタンス共有
src/auth0Context.jsを作成し、以下のように実装します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import React, { createContext, useContext, useEffect, useState } from 'react'; import { useAuth0 } from '@auth0/auth0-react'; const Auth0Context = createContext(); export function Auth0Provider({ children }) { const { user, isAuthenticated, isLoading, loginWithRedirect, logout } = useAuth0(); const [currentUser, setCurrentUser] = useState(null); useEffect(() => { if (isAuthenticated && !isLoading) { setCurrentUser(user); } }, [user, isAuthenticated, isLoading]); return ( <Auth0Context.Provider value={{ currentUser, loginWithRedirect, logout }}> {children} </Auth0Context.Provider> ); } export function useAuth() { return useContext(Auth0Context); } |
カスタムフックによる状態管理
useAuth()フックを用いて、認証情報を簡単に取得できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import { useAuth } from './auth0Context'; function ProfileComponent() { const { currentUser, logout } = useAuth(); if (!currentUser) return <div>ログインしてください</div>; return ( <div> <p>{currentUser.email}</p> <button onClick={logout}>ログアウト</button> </div> ); } |
まとめ
本記事では、ReactアプリにAuth0のUniversal Loginを実装する際の具体的な手順とコード例を解説しました。
- 導入準備: Auth0アカウントの登録とアプリケーション設定
- ライブラリ導入: auth0-reactパッケージのインストールと初期構成
- 認証フロー: 認証ボタンの作成とログイン処理の呼び出し
- セキュリティ対策: ユーザー情報取得とトークン検証ロジック(クライアント/サーバーサイド)
- 状態管理: Context APIによるグローバルな認証状態管理
実装時には、公式ドキュメントと本記事の手順を照らし合わせながら進めることが重要です。また、エラー処理やセキュリティ対策については、別途詳しく解説します。