oauth-implementation について
oauth-implementationは、OAuth 2.0とOpenID Connectによる認証実装を扱うスキルです。安全なログインとトークン管理を行うアプリの開発者向けに、認可フロー、PKCE、セキュリティ要件、複数言語の参考実装をまとめています。
主な機能
- 01OAuth 2.0の主要な認可フローを解説
- 02パブリッククライアント向けPKCEの説明
- 03Expressの認可コードフロー例
- 04トークンとリダイレクトの安全要件
- 05PythonおよびJavaの実装例を案内
活用シーン
- 01Webアプリに認可コードログインを実装
- 02SPAやモバイルアプリにPKCEを設定
- 03サービス間のクライアントクレデンシャル認証
- 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 Code | Web アプリ(最もセキュア) |
| Authorization Code + PKCE | SPA、モバイルアプリ |
| 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 パラメーターの検証を省略する
- クライアントシークレットをフロントエンドに公開する
- 有効期間の長いアクセストークンを使用する
コメント
Markdown 対応