APM

>Agent Skill

@mattnigh/claude-skills-authentication-flows-skill-md

skillsecurity

## 概要 📚 リソース参照: このスキルには以下のリソースが含まれています。 必要に応じて該当するリソースを参照してください: - `.claude/skills/authentication-flows/resources/api-key.md`: API Key Authentication - `.claude/skills/authentication-flows/resources/jwt.md`: JSON Web Token (JWT) - `.claude/skills/authentication-flows/resources/mtls.md`: Mutual TLS (mTLS) - `.claude/skills/authentication-flows/resources/oauth2.md`: OAuth 2.0フロー種別(Authorization Code・PKCE・Client Credentials・Device Code)の実装ガイドとTypeScriptサンプルコード - `.claude/skills/authentication-flows/templates/jwt-service-template.ts`: JWT Service Template - `.claude/skills/authentication-flows/templates/oauth2-client-template.ts`: OAuth 2.0 Client Template - `.claude/skills/authentication-flows/scripts/validate-auth-config.mjs`: Authentication Configuration Validator 専門分野: - (要追加) 使用タイミング: - (要追加) Use proactively when (要追加).

typescriptapi-designsecurity
apm::install
$apm install @mattnigh/claude-skills-authentication-flows-skill-md
apm::skill.md
---
name: .claude/skills/authentication-flows/SKILL.md
description: |
  ## 概要
  📚 リソース参照:
  このスキルには以下のリソースが含まれています。
  必要に応じて該当するリソースを参照してください:

  - `.claude/skills/authentication-flows/resources/api-key.md`: API Key Authentication
  - `.claude/skills/authentication-flows/resources/jwt.md`: JSON Web Token (JWT)
  - `.claude/skills/authentication-flows/resources/mtls.md`: Mutual TLS (mTLS)
  - `.claude/skills/authentication-flows/resources/oauth2.md`: OAuth 2.0フロー種別(Authorization Code・PKCE・Client Credentials・Device Code)の実装ガイドとTypeScriptサンプルコード
  - `.claude/skills/authentication-flows/templates/jwt-service-template.ts`: JWT Service Template
  - `.claude/skills/authentication-flows/templates/oauth2-client-template.ts`: OAuth 2.0 Client Template
  - `.claude/skills/authentication-flows/scripts/validate-auth-config.mjs`: Authentication Configuration Validator

  専門分野:
  - (要追加)

  使用タイミング:
  - (要追加)

  Use proactively when (要追加).
version: 1.0.0
---

# Authentication Flows スキル

## 概要

外部API認証の実装パターンを提供するスキル。
OAuth 2.0、JWT、API Key、相互TLSなど、主要な認証方式の
実装手法とセキュリティベストプラクティスを解説します。

## 対象エージェント

- .claude/agents/gateway-dev.md
- @backend-architect
- @security-engineer
- .claude/agents/auth-specialist.md

## 含まれるリソース

### 1. OAuth 2.0 (resources/oauth2.md)

- Authorization Code Flow
- Client Credentials Flow
- PKCE拡張
- トークンリフレッシュ戦略

### 2. JWT (resources/jwt.md)

- JWT構造と検証
- 署名アルゴリズム選択
- クレーム設計
- トークンローテーション

### 3. API Key (resources/api-key.md)

- API Key管理
- 安全な保存方法
- ローテーション戦略
- 使用量追跡

### 4. 相互TLS (resources/mtls.md)

- 証明書ベース認証
- 証明書管理
- 信頼チェーン構築
- 証明書ローテーション

## ワークフロー

```
1. 認証要件分析
   ├── サービス間 vs ユーザー認証の判断
   ├── セキュリティ要件の特定
   └── 既存認証基盤の確認

2. 認証方式選択
   ├── OAuth 2.0: ユーザー委譲、サードパーティ連携
   ├── JWT: ステートレス認証、マイクロサービス
   ├── API Key: シンプルなサービス間通信
   └── mTLS: 高セキュリティ要件

3. 実装
   ├── 認証フローの実装
   ├── トークン管理の実装
   └── エラーハンドリング

4. セキュリティ検証
   ├── 脆弱性テスト
   ├── トークンリーク検出
   └── 有効期限検証
```

## 認証方式選択ガイド

| シナリオ                   | 推奨方式                     | 理由                       |
| -------------------------- | ---------------------------- | -------------------------- |
| ユーザー代理でAPI呼び出し  | OAuth 2.0 Auth Code          | ユーザー同意フロー対応     |
| サービス間通信             | OAuth 2.0 Client Credentials | サービスアカウント認証     |
| SPAからのAPI呼び出し       | OAuth 2.0 + PKCE             | トークン漏洩対策           |
| 社内マイクロサービス       | JWT                          | ステートレス、検証容易     |
| シンプルなAPI連携          | API Key                      | 実装簡易、低オーバーヘッド |
| 金融・医療等高セキュリティ | mTLS                         | 双方向認証、強力な暗号化   |

## ベストプラクティス

### トークン管理

```typescript
// トークンキャッシュとリフレッシュ
class TokenManager {
  private accessToken: string | null = null;
  private refreshToken: string | null = null;
  private expiresAt: number = 0;

  async getToken(): Promise<string> {
    // 有効期限の5分前にリフレッシュ
    if (this.accessToken && Date.now() < this.expiresAt - 5 * 60 * 1000) {
      return this.accessToken;
    }

    if (this.refreshToken) {
      return this.refreshAccessToken();
    }

    return this.authenticate();
  }

  private async refreshAccessToken(): Promise<string> {
    // リフレッシュトークンで新しいアクセストークン取得
  }

  private async authenticate(): Promise<string> {
    // 初回認証
  }
}
```

### シークレット管理

```typescript
// 環境変数からシークレット取得
function getSecret(name: string): string {
  const value = process.env[name];
  if (!value) {
    throw new Error(`Missing required secret: ${name}`);
  }
  return value;
}

// AWS Secrets Manager例
async function getSecretFromSecretsManager(secretId: string): Promise<string> {
  const client = new SecretsManagerClient({});
  const response = await client.send(
    new GetSecretValueCommand({ SecretId: secretId }),
  );
  return response.SecretString!;
}
```

### エラーハンドリング

```typescript
// 認証エラーの分類
function handleAuthError(error: unknown): never {
  if (error instanceof AuthError) {
    switch (error.code) {
      case "invalid_token":
        // トークン無効 → 再認証
        throw new UnauthorizedError("Token is invalid or expired");

      case "insufficient_scope":
        // スコープ不足 → 403
        throw new ForbiddenError("Insufficient permissions");

      case "invalid_client":
        // クライアント設定エラー → 設定確認
        throw new ConfigurationError("Invalid client credentials");

      default:
        throw new AuthenticationError(error.message);
    }
  }
  throw error;
}
```

## セキュリティチェックリスト

### 設計時

- [ ] 適切な認証方式を選択したか?
- [ ] トークン有効期限を設定したか?
- [ ] シークレットの保存場所を決定したか?

### 実装時

- [ ] トークンをログに出力していないか?
- [ ] HTTPSを使用しているか?
- [ ] エラーメッセージに機密情報を含めていないか?

### 運用時

- [ ] シークレットローテーションが設定されているか?
- [ ] 認証失敗のモニタリングがあるか?
- [ ] トークン漏洩検出の仕組みがあるか?

## アンチパターン

### ❌ トークンのログ出力

```typescript
// NG: トークンをログに出力
console.log("Token:", accessToken);
logger.info({ headers: request.headers }); // Authorizationヘッダー含む

// ✅ マスキング
console.log("Token:", maskToken(accessToken));
logger.info({ headers: maskHeaders(request.headers) });
```

### ❌ ハードコードされたシークレット

```typescript
// NG: コードにシークレット埋め込み
const apiKey = "sk-12345-secret-key";

// ✅ 環境変数使用
const apiKey = process.env.API_KEY;
```

### ❌ 無期限トークン

```typescript
// NG: 有効期限なしのJWT
const token = jwt.sign({ userId: 123 }, secret);

// ✅ 適切な有効期限
const token = jwt.sign({ userId: 123 }, secret, { expiresIn: "1h" });
```

## 参考資料

- **RFC 6749**: The OAuth 2.0 Authorization Framework
- **RFC 7519**: JSON Web Token (JWT)
- **RFC 7636**: Proof Key for Code Exchange (PKCE)
- **OWASP**: Authentication Cheat Sheet

## 関連スキル

- .claude/skills/api-client-patterns/SKILL.md: APIクライアント実装パターン
- .claude/skills/http-best-practices/SKILL.md: HTTPベストプラクティス
- .claude/skills/rate-limiting/SKILL.md: レート制限実装