mcpField
A
api-authentication

api-authentication

github.com/secondskyセキュリティ240539 回インストール5 週間前に更新
リポジトリ

api-authentication について

API 開発者向けの認証実装スキルです。JWT、OAuth 2.0、API キー、セッションを扱い、セキュリティ要件やよくある誤りも説明します。

主な機能

  1. 01JWT 認証のガイダンス
  2. 02OAuth 2.0 連携の解説
  3. 03API キーとセッション方式
  4. 04Node.js と Flask の例
  5. 05認証のセキュリティ要件

活用シーン

  1. 01API の認証方式の選定
  2. 02JWT トークン認証の実装
  3. 03サードパーティー OAuth サービスへの接続

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/secondsky/claude-skills --skill api-authentication

インストール後、Claude Code で/api-authenticationを入力して読み込まれたか確認します。

同梱ファイルreferences/python-flask.md

詳細

API 認証

最新の標準とベストプラクティスを用いて、API の安全な認証方式を実装します。

認証方式

方式用途セキュリティレベル
JWTステートレス認証、SPA高
OAuth 2.0サードパーティとの連携高
API Keysサービス間通信中
Session従来型の Web アプリ高

JWT の実装(Node.js)

const jwt = require('jsonwebtoken');

const generateTokens = (user) => ({
  accessToken: jwt.sign(
    { userId: user.id, role: user.role },
    process.env.JWT_SECRET,
    { expiresIn: '15m' }
  ),
  refreshToken: jwt.sign(
    { userId: user.id, type: 'refresh' },
    process.env.REFRESH_SECRET,
    { expiresIn: '7d' }
  )
});

const authMiddleware = (req, res, next) => {
  const authHeader = req.headers.authorization;

  // Validate authorization header format
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return res.status(401).json({ error: 'Malformed authorization header' });
  }

  const parts = authHeader.split(' ');
  if (parts.length !== 2) {
    return res.status(401).json({ error: 'Malformed authorization header' });
  }

  const token = parts[1];
  if (!token) {
    return res.status(401).json({ error: 'No token provided' });
  }

  try {
    req.user = jwt.verify(token, process.env.JWT_SECRET);
    next();
  } catch (err) {
    res.status(401).json({ error: 'Invalid token' });
  }
};

セキュリティ要件

  • 必ず HTTPS を使用します
  • トークンは HttpOnly Cookie に保存します(localStorage は使用しません)
  • パスワードは bcrypt でハッシュ化します(コスト係数は 12 以上)
  • 認証エンドポイントにレート制限を実装します
  • シークレットは定期的にローテーションします
  • トークンを URL で送信しないでください

セキュリティヘッダー

app.use((req, res, next) => {
  res.setHeader('X-Content-Type-Options', 'nosniff');
  res.setHeader('X-Frame-Options', 'DENY');
  res.setHeader('Strict-Transport-Security', 'max-age=31536000');
  next();
});

追加の実装

以下を参照してください。references/python-flask.md:

  • ロールベースのアクセス制御デコレーターを使った Flask JWT
  • Authlib を使った OAuth 2.0 Google 連携
  • セキュアなハッシュ化を使った API キー認証

避けるべきよくある間違い

  • 平文のパスワードを保存する
  • 弱い JWT シークレットを使用する
  • トークンの有効期限を無視する
  • 本番環境で HTTPS を無効にする
  • 機密性の高いトークンをログに記録する

コメント