DOCS

OAuth 2.0認証

非対称キー暗号化を使用し、共有シークレットを使用せずに、Zonos でバックエンド サービスを認証します。

Zonos は、OAuth 2.0 JWT Bearer Token Grant (RFC 7523) を介したマシン間認証をサポートします。サービスは、RSA 秘密キーを使用して有効期間の短い JWT に署名します。 Zonos は、登録された公開キーを使用してそれを検証し、組織をスコープとするベアラー トークンを返します。

フローの概要:

  1. RSA キー ペアを生成し、公開キーを Zonos に登録します。
  2. 実行時に、秘密キーを使用して JWT アサーションに署名し、それをトークン エンドポイントに POST します。
  3. Zonos は、有効期間が短い アクセス トークンを返します。
  4. すべての API リクエストにアクセス トークンを Authorization: Bearer <token> として含めます。

トークンのライフサイクルとキャッシュ 

アクセス トークンは、デフォルトでは 5 分で期限切れになります。トークンをキャッシュし、プロアクティブに更新します。API 呼び出しごとに新しいトークンを要求しないでください。各更新には、新しく署名された JWT アサーションが必要です。

1import time, requests
2 
3_cache = {"access_token": None, "expires_at": 0}
4 
5def get_access_token():
6 if time.time() < _cache["expires_at"] - 30:
7 return _cache["access_token"]
8 
9 assertion = build_jwt_assertion()
10 data = requests.post(
11 "https://auth.zonos.com/oauth/token",
12 json={
13 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
14 "assertion": assertion,
15 },
16 ).json()
17 
18 _cache["access_token"] = data["access_token"]
19 _cache["expires_at"] = time.time() + data["expires_in"]
20 return _cache["access_token"]

エラー参照 

すべてのエラーは、OAuth 2.0 エラー応答形式 (RFC 6749 §5.2) に従います。

1{
2 "error": "invalid_grant",
3 "error_description": "JWT assertion has expired"
4}
HTTPステータスerror原因
400unsupported_grant_typegrant_typeurn:ietf:params:oauth:grant-type:jwt-bearer ではありませんでした
400invalid_requestフィールドが欠落しているか不正な形式である
401invalid_grant無効な署名、期限切れのアサーション、不明な組織、または未登録のキー
500server_error内部エラー - 解決しない場合は、Zonos サポートにお問い合わせください

一般的な invalid_grant の原因:

  • exp は過去のものです - システム クロックが NTP 同期されていることを確認してください
  • aud は正確には "zonos-auth" ではありません
  • iss が登録された組織 ID と一致しません
  • 公開鍵はローテーションされましたが、まだ Zonos で更新されていません

セキュリティのベスト プラクティス 

  • 秘密キーを保護します。 秘密キーを専用のシークレット マネージャーに保存します。ソース管理、環境変数、ログには決して保存しないでください。
  • アサーションの有効期間は短くしてください。 60 ~ 300 秒が標準です。長いものを発行する理由はありません。
  • jti を含めます。 アサーションごとに一意の値により、サーバー側のリプレイ検出が可能になります。
  • キー ペアを定期的にローテーションします。 ダウンタイムを回避するために、古い公開キーを取り消す前に、新しい公開キーを Zonos に登録します。
  • access_token または assertion の値をログに記録しないでください。 両方を資格情報として扱います。

このページは役に立ちましたか?