APIドキュメント
高度な認証パターン — OAuth 2.0、JWT、キーローテーション
エンタープライズ環境でSmart Money APIを統合するための高度な認証メカニズムを習得しましょう。OAuth 2.0フロー、JWTトークンパターン、安全なキーローテーション、多要素認証の実装を学びます。
2026年3月21日公開
•
18分で読める
•
上級
認証の概要
Smart Money APIは、さまざまなアプリケーションアーキテクチャ、セキュリティ要件、組織ポリシーに対応するために設計された複数の認証方法をサポートしています。これらのパターンを理解することで、統合が安全かつ高性能であることを保証します。
Smart Money APIの認証は、主に3つのレイヤーで動作します:
- APIキー — 開発やシンプルな統合のためのシンプルなBearerトークン認証
- JWTトークン — 分散システムやマイクロサービス向けのステートレスで暗号的に署名されたトークン
- OAuth 2.0 — サードパーティ統合やSaaSアプリケーションのための委任認証フレームワーク
セキュリティ原則: 認証情報をクライアントサイドコード、ログ、バージョン管理、またはエラーメッセージに公開しないでください。スケジュールに従って、また侵害が発生した場合には直ちに認証情報のローテーションを実施してください。
各メソッドにはそれぞれ異なる利点があります。APIキーは、認証情報の保存が制御されているバックエンド間通信に最適です。JWTトークンは、共有状態が利用できない分散アーキテクチャで優れています。OAuth 2.0は、サードパーティアプリケーション向けにユーザー委任アクセスを提供します。
APIキー認証
APIキーは最もシンプルな認証メカニズムです。これは、あなたのアカウントに対して生成されたランダムな文字列で、Smart Money APIに対してあなたのアプリケーションを識別します。すべてのリクエストには、ヘッダーまたはクエリパラメータとしてAPIキーを含める必要があります。
ヘッダーベースのAPIキー
推奨される方法は、Bearerスキームを使用してAuthorizationヘッダーにAPIキーを渡すことです:
curl -X GET "https://api.smartmoneyapi.com/v1/whales/btc" \
-H "Authorization: Bearer sk_live_1234567890abcdef" \
-H "Accept: application/json"
クエリパラメータとしてのAPIキー
WebSocket接続やヘッダーを変更できない場合、APIキーをクエリパラメータとして渡します:
ws://localhost:8877/ws?api_key=sk_live_1234567890abcdef
// 認証済みWebSocketストリームを確立します
APIキーの特性
| プロパティ |
説明 |
| 形式 |
128文字の16進数文字列で、sk_test_またはsk_live_が接頭辞として付きます |
| スコープ |
作成したアカウントのすべての権限を継承します |
| 有効期限 |
自動的に期限切れになることはありません。手動でローテーションする必要があります |
| ローテーション |
新しいキーを生成し、トラフィックを移行してから、古いキーを無効化します |
| レート制限 |
同じキーを使用するすべてのリクエストで共有されます |
APIキーのセキュリティ対策
- 環境変数 — キーを.envファイルに保存し(バージョン管理にはコミットせず)、実行時に読み込みます
- ボールトシステム — 本番環境ではHashiCorp Vault、AWS Secrets Manager、またはAzure Key Vaultを使用してください
- キーの分離 — テスト用キーと本番用キーを分けて管理し、テストキーは頻繁にローテーションしてください
- 最小限のスコープ — 可能な場合、異なる統合ごとに個別のキーを作成してください
- 監査ログ — APIキーの作成と使用イベントをすべてログに記録してください
30秒でAPIキーを取得
構築の準備はできましたか?無料のAPIキー(1日100回呼び出し可能、カード不要)を取得して、生のホエールデータ、資金調達データ、オンチェーンデータの取得を開始しましょう。
APIキーを取得 →
Bearerトークンパターン
Bearerトークンは、単純なAPIキーの概念を拡張し、コンテキスト、有効期限、リフレッシュメカニズムを追加します。プログラムによる認証情報管理が必要なアプリケーションに最適です。
Bearerトークンの取得
APIキーとシークレットを24時間有効なBearerトークンと交換します:
curl -X POST "https://api.smartmoneyapi.com/v1/auth/token" \
-H "Content-Type: application/json" \
-d '{
"api_key": "sk_live_1234567890",
"api_secret": "secret_abc123xyz"
}'
トークン応答フォーマット
エンドポイントはメタデータ付きのBearerトークンを返します:
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 86400,
"refresh_token": "refresh_1234567..."
}
Bearerトークンの使用
以降のすべてのリクエストには、Authorizationヘッダーにトークンを含めてください:
curl -X GET "https://api.smartmoneyapi.com/v1/derivatives/funding-heatmap" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."
トークンリフレッシュフロー
トークンの有効期限が近づいたら、APIシークレットを必要とせずにリフレッシュトークンを使用して新しいトークンを取得します:
curl -X POST "https://api.smartmoneyapi.com/v1/auth/refresh" \
-H "Content-Type: application/json" \
-d '{
"refresh_token": "refresh_1234567..."
}'
OAuth 2.0実装
OAuth 2.0により、ユーザーは認証情報を共有することなく、アプリケーションにSmart Money APIアカウントへのアクセスを許可できます。これはSaaSプラットフォーム、サードパーティ統合、マルチテナントアプリケーションに不可欠です。
OAuth 2.0認可コードフロー
ウェブアプリケーション向けの標準フロー:
- ユーザーログイン開始 — ユーザーが「Smart Money APIで接続」をクリック
- 認証サーバーへのリダイレクト — アプリがユーザーをSmart Moneyの認証エンドポイントにリダイレクト
- ユーザーが権限を許可 — ユーザーが要求されたスコープを確認しアクセスを許可
- 認可コードが返される — 認可コード付きでユーザーがリダイレクト戻される
- コードをトークンと交換 — バックエンドがコードをアクセストークンと交換(コードがフロントエンドに露出することはありません)
- トークンを保存 — リフレッシュトークンを安全に保管し、API呼び出しにはアクセストークンを使用する
ステップ1: ユーザーを認証エンドポイントにリダイレクト
// ユーザーをリダイレクトするURL
const authUrl = new URL('https://api.smartmoneyapi.com/oauth/authorize');
authUrl.searchParams.append('client_id', 'your_client_id');
authUrl.searchParams.append('redirect_uri', 'https://yourapp.com/callback');
authUrl.searchParams.append('response_type', 'code');
authUrl.searchParams.append('scope', 'whales derivatives onchain');
authUrl.searchParams.append('state', generateRandomState());
window.location.href = authUrl.toString();
ステップ2: コールバックの処理とコードの交換
// バックエンドが/callbackルートを処理
const code = req.query.code;
const storedState = req.session.state;
const receivedState = req.query.state;
// stateパラメータの検証
if (storedState !== receivedState) {
throw new Error('State mismatch - CSRF attack detected');
}
// コードをトークンと交換
const tokenResponse = await fetch('https://api.smartmoneyapi.com/oauth/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
grant_type: 'authorization_code',
code: code,
client_id: process.env.OAUTH_CLIENT_ID,
client_secret: process.env.OAUTH_CLIENT_SECRET,
redirect_uri: 'https://yourapp.com/callback'
})
});
const tokens = await tokenResponse.json();
// トークンを安全に保管
OAuthスコープ
アプリケーションが必要とするスコープのみをリクエストしてください。Smart Money APIでは以下のスコープを定義しています:
| スコープ |
説明 |
| whales |
クジラウォレットの追跡と蓄積メトリクスへのアクセス |
| derivatives |
先物、パーペチュアル、資金調達レートデータへのアクセス |
| onchain |
オンチェーン取引フローと分析へのアクセス |
| alerts |
ウェブフックアラートの作成と管理 |
| offline |
オフラインで新しいアクセストークンを取得するためのリフレッシュトークンへのアクセス |
JWTトークン管理
JWT(JSON Webトークン)はステートレス認証を提供します。サーバーはセッションデータを保存する必要がありません。Smart Money APIではトークン署名にRS256(RSA署名とSHA-256)を使用しており、APIに接続せずに検証が可能です。
JWT構造
JWTトークンはドットで区切られた3つの部分で構成されます:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEifQ.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFjY3QxMjM0In0.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
// ヘッダー.ペイロード.署名
JWTヘッダー
ヘッダーはアルゴリズムとトークンタイプを識別します:
{
"alg": "RS256",
"typ": "JWT",
"kid": "1"
}
JWTペイロードクレーム
ペイロードにはクレーム(ユーザー/アプリに関する情報)が含まれます:
{
"sub": "acct_1234567890",
"name": "Trading Bot",
"iat": 1703001600,
"exp": 1703088000,
"scopes": ["whales", "derivatives"],
"aud": "https://api.smartmoneyapi.com"
}
JWT署名の検証
Smart Moneyの公開鍵をダウンロードし、トークンを受け入れる前に検証してください:
const jwt = require('jsonwebtoken');
const fs = require('fs');
// Smart Money APIから公開鍵を取得
const publicKey = fs.readFileSync('smartmoney-public.pem');
// トークンの検証
try {
const decoded = jwt.verify(token, publicKey, {
algorithms: ['RS256'],
audience: 'https://api.smartmoneyapi.com',
issuer: 'https://api.smartmoneyapi.com'
});
// トークンが有効、デコードされたクレームを使用
} catch (err) {
// トークンが無効または期限切れ
}
鍵ローテーション戦略
セキュリティを維持するため、定期的な鍵ローテーションが重要です。完璧なセキュリティ対策を講じていても、鍵が侵害される可能性があると想定し、体系的なローテーションを実装してください。
ローテーション頻度
Smart Moneyでは、鍵の種類と使用状況に基づいて異なるローテーションスケジュールを推奨しています:
| 鍵の種類 |
推奨ローテーション |
最低ローテーション |
| テスト用APIキー |
月次 |
四半期ごと |
| 本番用APIキー |
四半期ごと |
年次 |
| OAuthリフレッシュトークン |
自動(90日後) |
手動(180日後) |
| サービスアカウントキー |
半年ごと |
年次 |
ダウンタイムなしのローテーションプロセス
サービスを中断せずに鍵をローテーション:
- 新しい鍵を生成 — ダッシュボードまたはAPIを通じて新しいAPIキーを作成
- 新しい鍵をデプロイ — ステージング環境でアプリケーションシークレットを更新し、十分にテスト
- 段階的なロールアウト — サーバーの10%にデプロイし、エラーを監視
- 本格的な展開 — 残りのサーバーにデプロイ
- トラフィックの確認 — すべてのリクエストが新しいキーを使用していることを確認
- 旧キーの無効化 — 旧キーを非アクティブとしてマーク(即時削除はしない)
- 旧キーの削除 — 48時間エラーがなければ完全削除
緊急キーローテーション
キーが侵害された疑いがある場合:
// 即時対応: 侵害されたキーを無効化
curl -X POST "https://api.smartmoneyapi.com/v1/keys/sk_live_xxx/revoke" \
-H "Authorization: Bearer token"
// 直ちに代替キーを生成
curl -X POST "https://api.smartmoneyapi.com/v1/keys" \
-H "Content-Type: application/json" \
-d '{
"name": "緊急代替キー"
}'
Kubernetesでの自動ローテーション
Kubernetes Secretsとオペレーターを使用した自動ローテーション:
apiVersion: batch/v1
kind: CronJob
metadata:
name: api-key-rotator
spec:
schedule: "0 0 * * 0" # 毎週日曜日
jobTemplate:
spec:
template:
spec:
containers:
- name: rotator
image: smartmoney-key-rotator:latest
多要素認証(MFA)
本番データにアクセスするアカウントには、MFAにより認証情報に加えて第二の要素を要求することで追加のセキュリティ層を提供します。
サポートされるMFA方式
- TOTP(時間ベースのワンタイムパスワード) — Google Authenticator、Authyなどのアプリ
- WebAuthn/FIDO2 — ハードウェアセキュリティキー、生体認証
- SMSワンタイムコード — 安全性は低いが広くサポート
- メール確認 — 登録メールに確認コードを送信
アカウントアクセス用TOTPの有効化
// ステップ1: MFA設定をリクエスト
curl -X POST "https://api.smartmoneyapi.com/v1/account/mfa/enable" \
-H "Authorization: Bearer token"
// レスポンスにQRコードURLを含む
{
"qr_code_url": "https://...",
"secret": "JBSWY3DPEBLW64TMMQ...",
"backup_codes": ["12345678", ...]
}
API操作時のMFA
認証後も機密操作にはMFA確認が必要な場合があります:
// 機密操作(キーローテーション)の試行
curl -X POST "https://api.smartmoneyapi.com/v1/keys/rotate" \
-H "Authorization: Bearer token" \
-H "X-MFA-Token: mfa_challenge_abc123"
// レスポンス: MFAが必要
{
"error": "mfa_required",
"mfa_token": "mfa_xyz789"
}
// TOTPコードで再試行
curl -X POST "https://api.smartmoneyapi.com/v1/keys/rotate" \
-H "Authorization: Bearer token" \
-H "X-MFA-Code: 123456"
セキュリティベストプラクティス
認証の強度は実装次第です。セキュリティを維持するため以下のプラクティスに従ってください:
シークレット管理
- シークレットをバージョン管理にコミットしない — .gitignoreで.envファイルを使用
- 環境変数を使用 — 安全なシークレット管理システムから読み込み
- リポジトリをスキャン — TruffleHogやdetect-secretsなどのツールで露出したキーを検出
- アクセスログを監査 — 誰がいつシークレットにアクセスしたかを監視
転送セキュリティ
- 常にHTTPSを使用 — 認証情報を暗号化されていない接続で送信しない
- SSL証明書を検証 — 本番環境で証明書検証を無効化しない
- 証明書ピンニングを使用 — モバイルアプリでMITM攻撃を防止
- TLS 1.2+を強制 — 古いプロトコルを無効化
認証情報の取り扱い
- シークレットをハッシュ化 — 平文ではなくbcryptまたはArgon2ハッシュを保存
- 有効期間を最小化 — 必要な間だけメモリに認証情報を保持
- 機密データを消去 — 使用後は明示的に認証情報を上書き
- 安全なライブラリを使用 — 暗号化を独自実装しない
ロギングと監視
- 認証情報をログに記録しない — ログ内のキーを編集し、ログマスキングを使用
- 認証イベントをログ — 成功/失敗したログイン試行を追跡
- 異常を監視 — 異常なアクセスパターンでアラート
- キー使用を監査 — どのキーがどのデータにアクセスしたかを追跡
エンタープライズ認証パターン
大規模組織では追加のセキュリティ制御とコンプライアンス機能が必要になることが多いです。
SAML 2.0統合
エンタープライズ顧客向けに、Smart Money APIは組織のIDプロバイダー(Okta、Azure ADなど)とのSAML 2.0統合をサポートします:
- シングルサインオン(SSO) — ユーザーは企業のIdPで認証
- 自動プロビジョニング — グループメンバーシップに基づきアカウントを作成/無効化
- 強制 — すべてのユーザーアクセスにSAMLを要求
IPホワイトリスト
特定のIPアドレスまたはCIDR範囲にAPIアクセスを制限する:
// IPをホワイトリストに追加
curl -X POST "https://api.smartmoneyapi.com/v1/account/ip-whitelist" \
-H "Authorization: Bearer token" \
-d '{
"cidr": "203.0.113.0/24",
"description": "本番サーバー"
}'
監査ログとコンプライアンス
エンタープライズプランにはコンプライアンスのための包括的な監査ログが含まれます:
| イベント |
記録されるデータ |
| 認証 |
ユーザー、タイムスタンプ、成功/失敗、IP、MFAステータス |
| キー操作 |
キーID、アクション、開始者、タイムスタンプ |
| アカウント変更 |
変更内容、変更者、タイムスタンプ、変更前/変更後の値 |
| データアクセス |
ユーザー、エンドポイント、スコープ、タイムスタンプ、レコード数 |
認証問題のトラブルシューティング
無効なAPIキーエラー
問題: "401 Unauthorized - Invalid API Key"が表示される
解決策:
- キーの形式を確認(sk_test_またはsk_live_で始まる必要があります)
- キーの前後にある空白をチェック
- キーが無効化またはローテーションされていないことを確認
- 正しい環境を使用しているか確認(テスト環境にはテストキー、本番環境にはライブキー)
- APIキーの権限がエンドポイントの要件と一致しているか確認
トークン期限切れエラー
問題: Bearerトークンの期限が切れ、リクエストが失敗する
解決策:
- リフレッシュトークンを使用して新しいアクセストークンを取得
- 期限切れ5分前に自動トークンリフレッシュを実装
- リフレッシュトークンを安全に保管(SPAのlocalStorageには保存しない)
- 401レスポンスをリフレッシュトークンフローで処理
CORS/プリフライトエラー
問題: ブラウザがCORSエラーでリクエストをブロック
解決策:
- ブラウザからのAPI呼び出しはホワイトリスト登録されたオリジンからのみ許可
- ダッシュボードでドメインを追加: 設定 → CORSオリジン
- ブラウザは自動的にOPTIONSプリフライトリクエストを送信
- 開発時はlocalhost:3000などを使用
MFAチャレンジが完了しない
問題: 正しいコードでもMFAが必要な操作が失敗する
解決策:
- サーバーの時刻同期を確認(TOTPは時間に依存)
- コードは30秒間のみ有効、新しいコードを生成
- 認証アプリが利用できない場合はバックアップコードを使用
- 登録メールでアカウント復旧可能
今すぐ安全な認証を実装
Smart Money APIはOAuth 2.0、JWT、MFA、SAML統合に対応したエンタープライズグレードの認証をサポート。業界のベストプラクティスでAPI統合を保護。
エンタープライズプランを確認
SAML、IPホワイトリスト、専用サポートが必要ですか?営業チームにお問い合わせください。