mcpField
O
oauth-implementation

oauth-implementation

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

oauth-implementation について

oauth-implementationは、OAuth 2.0とOpenID Connectによる認証実装を扱うスキルです。安全なログインとトークン管理を行うアプリの開発者向けに、認可フロー、PKCE、セキュリティ要件、複数言語の参考実装をまとめています。

主な機能

  1. 01OAuth 2.0の主要な認可フローを解説
  2. 02パブリッククライアント向けPKCEの説明
  3. 03Expressの認可コードフロー例
  4. 04トークンとリダイレクトの安全要件
  5. 05PythonおよびJavaの実装例を案内

活用シーン

  1. 01Webアプリに認可コードログインを実装
  2. 02SPAやモバイルアプリにPKCEを設定
  3. 03サービス間のクライアントクレデンシャル認証
  4. 04トークンローテーションとセッション更新の設計

インストール

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

$npx skills add https://github.com/secondsky/claude-skills --skill oauth-implementation

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

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

詳細

OAuth の実装

セキュアな認証のために OAuth 2.0 と OpenID Connect を実装します。

OAuth 2.0 フロー

フロー用途
Authorization CodeWeb アプリ(最もセキュア)
Authorization Code + PKCESPA、モバイルアプリ
Client Credentialsサービス間通信
Refresh Tokenセッションの更新

Authorization Code フロー(Express)

const express = require('express');
const jwt = require('jsonwebtoken');

// Step 1: Redirect to authorization
app.get('/auth/login', (req, res) => {
  const state = crypto.randomBytes(16).toString('hex');
  req.session.oauthState = state;

  const params = new URLSearchParams({
    client_id: process.env.CLIENT_ID,
    redirect_uri: process.env.REDIRECT_URI,
    response_type: 'code',
    scope: 'openid profile email',
    state
  });

  res.redirect(`${PROVIDER_URL}/authorize?${params}`);
});

// Step 2: Handle callback
app.get('/auth/callback', async (req, res) => {
  if (req.query.state !== req.session.oauthState) {
    return res.status(400).json({ error: 'Invalid state' });
  }

  const tokenResponse = await fetch(`${PROVIDER_URL}/token`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({
      grant_type: 'authorization_code',
      code: req.query.code,
      redirect_uri: process.env.REDIRECT_URI,
      client_id: process.env.CLIENT_ID,
      client_secret: process.env.CLIENT_SECRET
    })
  });

  const tokens = await tokenResponse.json();
  // Store tokens securely and create session
});

パブリッククライアント向けの PKCE

function generatePKCE() {
  const verifier = crypto.randomBytes(32).toString('base64url');
  const challenge = crypto
    .createHash('sha256')
    .update(verifier)
    .digest('base64url');
  return { verifier, challenge };
}

セキュリティ要件

  • HTTPS を必ず使用します
  • リダイレクト URI を厳密に検証します
  • パブリッククライアントでは PKCE を使用します
  • トークンは HttpOnly Cookie に保存します
  • トークンローテーションを実装します
  • 有効期間の短いアクセストークン(15 分)を使用します

その他の実装

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

  • Authlib OIDC プロバイダーを使用した Python Flask
  • OpenID Connect のディスカバリーおよび JWKS エンドポイント
  • Java Spring Security OAuth2 サーバー
  • トークンのイントロスペクションと失効

絶対に避けること

  • トークンを localStorage に保存する
  • implicit フローを使用する
  • state パラメーターの検証を省略する
  • クライアントシークレットをフロントエンドに公開する
  • 有効期間の長いアクセストークンを使用する

コメント