oauth-integrations について
Cloudflare WorkersなどのエッジランタイムでGitHubとMicrosoftのOAuthを実装するガイドです。認証フローを構築する開発者向けに、ランタイム制約、必須パラメーター、トークン処理、エラーへの対処を説明します。
主な機能
- 01GitHub OAuthのリクエストとトークン交換
- 02GitHubの非公開メールアドレスへの対応
- 03Microsoft Entraの手動OAuthフロー
- 04Microsoft Graph向けスコープの設定
- 05テナント設定とトークン有効期間の確認
活用シーン
- 01Cloudflare WorkersへのGitHubログイン導入
- 02Microsoft Graphからのユーザープロフィール取得
- 03長期セッション向けリフレッシュトークンの実装
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jezweb/ claude-skills --skill oauth-integrationsインストール後、Claude Code で/oauth-integrationsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.md.claude-plugin/plugin.jsonrules/github-oauth.mdmicrosoft-oauth.md詳細
エッジ環境向け OAuth インテグレーション
Cloudflare Workers やその他のエッジランタイムで GitHub と Microsoft の OAuth を実装します。
GitHub OAuth
必須ヘッダー
GitHub API には、他のプロバイダーとは異なる厳格な要件があります。
| ヘッダー | 要件 |
|---|---|
User-Agent | 必須 — 指定しないと 403 が返されます |
Accept | application/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 を実装します。
- OAuth URL を手動で構築する
- fetch で直接トークンを交換する
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 ポータルの設定
- アプリの登録 → 新規登録
- プラットフォーム:サーバー側 OAuth には Web(SPA ではない)を選択
- リダイレクト URI:
/callbackと/admin/callbackの両方を追加 - 証明書とシークレット → 新しいクライアントシークレット
トークンの有効期間
| トークンの種類 | デフォルトの有効期間 | 注意事項 |
|---|---|---|
| アクセストークン | 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 Forbidden | User-Agent ヘッダーがない | User-Agent ヘッダーを追加します |
email: null | ユーザーのメールアドレスが非公開 | user:email スコープを指定して /user/emails を取得します |
Microsoft のエラー
| エラー | 原因 | 修正方法 |
|---|---|---|
| AADSTS50058 | サイレント認証に失敗 | 対話型フローを使用します |
| AADSTS700084 | リフレッシュトークンの有効期限切れ | ユーザーを再認証します |
| Graph /me で 403 | User.Read スコープがない | スコープに User.Read を追加します |
リファレンス
- GitHub API:https://docs.github.com/en/rest
- GitHub OAuth:https://docs.github.com/en/apps/oauth-apps
- Microsoft Graph のアクセス許可:https://learn.microsoft.com/en-us/graph/permissions-reference
- AADSTS エラーコード:https://learn.microsoft.com/en-us/entra/identity-platform/reference-error-codes
コメント
Markdown 対応