mcpField
O
oauth-integrations

oauth-integrations

github.com/jezwebセキュリティ1.1k356 回インストール3 週間前に更新
リポジトリ

oauth-integrations について

Cloudflare WorkersなどのエッジランタイムでGitHubとMicrosoftのOAuthを実装するガイドです。認証フローを構築する開発者向けに、ランタイム制約、必須パラメーター、トークン処理、エラーへの対処を説明します。

主な機能

  1. 01GitHub OAuthのリクエストとトークン交換
  2. 02GitHubの非公開メールアドレスへの対応
  3. 03Microsoft Entraの手動OAuthフロー
  4. 04Microsoft Graph向けスコープの設定
  5. 05テナント設定とトークン有効期間の確認

活用シーン

  1. 01Cloudflare WorkersへのGitHubログイン導入
  2. 02Microsoft Graphからのユーザープロフィール取得
  3. 03長期セッション向けリフレッシュトークンの実装

インストール

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

$npx skills add https://github.com/jezweb/claude-skills --skill oauth-integrations

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
.claude-plugin/
plugin.json
rules/
github-oauth.md
microsoft-oauth.md

詳細

エッジ環境向け OAuth インテグレーション

Cloudflare Workers やその他のエッジランタイムで GitHub と Microsoft の OAuth を実装します。

GitHub OAuth

必須ヘッダー

GitHub API には、他のプロバイダーとは異なる厳格な要件があります。

ヘッダー要件
User-Agent必須 — 指定しないと 403 が返されます
Acceptapplication/vnd.github+json を推奨
const resp = await fetch('https://api.github.com/user', {
  headers: {
    Authorization: `Bearer ${accessToken}`,
    'User-Agent': 'MyApp/1.0',  // Required!
    'Accept': 'application/vnd.github+json',
  },
});
非公開メールアドレスの扱い

GitHub ユーザーはメールアドレスを非公開に設定できます(/user は email: null を返します)。

if (!userData.email) {
  const emails = await fetch('https://api.github.com/user/emails', { headers })
    .then(r => r.json());
  userData.email = emails.find(e => e.primary && e.verified)?.email;
}

user:email スコープが必要です。

トークン交換

トークン交換のレスポンスは、デフォルトではフォームエンコード形式です。JSON を取得するには Accept ヘッダーを追加します。

const tokenResponse = await fetch('https://github.com/login/oauth/access_token', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Accept': 'application/json',  // Get JSON response
  },
  body: new URLSearchParams({ code, client_id, client_secret, redirect_uri }),
});
GitHub OAuth に関する注意事項
問題解決策
コールバック URL完全一致が必要です。ワイルドカードやサブディレクトリとの一致には対応していません
トークン交換のレスポンスがフォームエンコード形式になる'Accept': 'application/json' ヘッダーを追加します
トークンに有効期限がないリフレッシュフローは不要ですが、トークンが取り消された場合は再認証が必要です

Microsoft Entra(Azure AD)OAuth

Workers で MSAL が動作しない理由

MSAL.js は以下に依存します。

  • ブラウザー API(localStorage、sessionStorage、DOM)
  • Node.js の crypto モジュール

Cloudflare の V8 アイソレートランタイムには、これらがありません。代わりに手動で OAuth を実装します。

  1. OAuth URL を手動で構築する
  2. fetch で直接トークンを交換する
  3. jose ライブラリで JWT を検証する
必須スコープ
// For user identity (email, name, profile picture)
const scope = 'openid email profile User.Read';

// For refresh tokens (long-lived sessions)
const scope = 'openid email profile User.Read offline_access';

重要:Microsoft Graph の /me エンドポイントには User.Read が必要です。これがない場合、トークン交換は成功しますが、ユーザー情報の取得で 403 が返されます。

ユーザー情報エンドポイント
// Microsoft Graph /me endpoint
const resp = await fetch('https://graph.microsoft.com/v1.0/me', {
  headers: { Authorization: `Bearer ${accessToken}` },
});

// Email may be in different fields
const email = data.mail || data.userPrincipalName;
テナントの設定
テナント値サインインできるユーザー
common任意の Microsoft アカウント(個人用と職場用)
organizations職場または学校のアカウントのみ
consumers個人用 Microsoft アカウントのみ
{tenant-id}特定の組織のみ
Azure ポータルの設定
  1. アプリの登録 → 新規登録
  2. プラットフォーム:サーバー側 OAuth には Web(SPA ではない)を選択
  3. リダイレクト URI:/callback と /admin/callback の両方を追加
  4. 証明書とシークレット → 新しいクライアントシークレット
トークンの有効期間
トークンの種類デフォルトの有効期間注意事項
アクセストークン60~90 分トークンの有効期間ポリシーで設定可能
リフレッシュトークン90 日パスワード変更時に取り消されます
ID トークン60 分アクセストークンと同じ

ベストプラクティス:常に offline_access スコープを要求し、1 時間を超えるセッションではリフレッシュトークンフローを実装してください。

よくある修正

Claude が提案した場合…代わりに使用する内容…
User-Agent なしで GitHub に fetch する'User-Agent': 'AppName/1.0' を追加します(必須)
Workers で MSAL.js を使用する手動 OAuth と JWT 検証用の jose
Microsoft のスコープに User.Read がないUser.Read スコープを追加します
トークンクレームのみからメールアドレスを取得するGraph の /me エンドポイントを使用します

エラーリファレンス

GitHub のエラー
エラー原因修正方法
403 ForbiddenUser-Agent ヘッダーがないUser-Agent ヘッダーを追加します
email: nullユーザーのメールアドレスが非公開user:email スコープを指定して /user/emails を取得します
Microsoft のエラー
エラー原因修正方法
AADSTS50058サイレント認証に失敗対話型フローを使用します
AADSTS700084リフレッシュトークンの有効期限切れユーザーを再認証します
Graph /me で 403User.Read スコープがないスコープに User.Read を追加します

リファレンス

コメント