この章では、R100サイトの一部コンテンツに認証・認可(アクセス制御)を実装した方法をまとめます。 Auth0によるID管理・OAuth2連携と、Netlify FunctionsによるAPI保護の仕組みをステップごとに解説します。


1. なぜ認証・認可が必要になったか

  • プライベートな実験記録や限定公開資料の管理ニーズ
  • 静的サイト(Hugo)ではデフォルトで認証機能がないため、外部認証の仕組みを後付け

2. Auth0セットアップ手順

  • Auth0に無料アカウント作成
  • 新規アプリケーション(SPA or Regular Web App)を作成
  • ドメイン・ClientID・Audienceなどを控える
  • コールバックURL・許可ドメインにNetlifyの公開URLを追加
  • ユーザーロールや権限制御が必要な場合はAuth0のRule/Actionを設定

3. Netlify FunctionsでAPI/ファイルアクセス保護

  • Netlifyプロジェクトに netlify/functions/ ディレクトリを作成
  • JWTトークン(IDトークン/アクセストークン)を受け取り、検証するサーバーレス関数を実装
const { NetlifyJwtVerifier } = require('@serverless-jwt/netlify')

const verifyJwt = NetlifyJwtVerifier({
  issuer: process.env.AUTH0_DOMAIN,
  audience: process.env.AUTH0_AUDIENCE,
})

exports.handler = verifyJwt(async (event, context) => {
  // 認証済みユーザーのみ処理を継続
  return {
    statusCode: 200,
    body: JSON.stringify({ message: '認証OK!' }),
  }
})
  • Markdownなど保護したいファイルはAPI経由で取得し、認証通過時のみ返却
  • ファイルパスやアクセス権チェック(パストラバーサル対策)も必須

4. フロントエンド認証連携(例:Auth0 SPA JS)

  • auth0-spa-jsでフロント側にログインボタン設置
  • ログイン成功後、アクセストークンをAPIリクエストに付与
  • 認証状態に応じてUI表示/非表示を切り替え
  • JS例:
import createAuth0Client from '@auth0/auth0-spa-js';

const auth0 = await createAuth0Client({
  domain: 'YOUR_AUTH0_DOMAIN',
  client_id: 'YOUR_CLIENT_ID',
  audience: 'YOUR_AUTH0_AUDIENCE',
});

await auth0.loginWithRedirect();
const token = await auth0.getTokenSilently();

// APIにトークン付きでアクセス
fetch('/.netlify/functions/protected-api', {
  headers: { Authorization: `Bearer ${token}` },
});

5. 実装時のハマりどころ・Tips

  • ローカル開発と本番でのCORSやリダイレクト先URLの違いに注意
  • Netlify Functionsの環境変数管理(公開/非公開の分離)
  • Auth0の無料枠制限やロール設計の落とし穴
  • JavaScript無効化時や古いブラウザでのフォールバック案
  • セキュリティ観点ではパストラバーサルや情報露出リスクにも配慮