ワーカーの設定
ワーカーを使用して、アイデンティティプロバイダーの最新の公開鍵をJWT検証設定に自動的に保持します。
- ゾーンIDを見つけます。このIDは、Cloudflareダッシュボード ↗のゾーン概要で確認できます。
- アイデンティティプロバイダーのJSON Web Key Set (JWKs) URLを見つけます。アイデンティティプロバイダーは、一般的にOpen Authorization (OAuth)設定にリストしています。
- トークン検証設定を作成します。
- API Gatewayの
Write権限を持つ新しいAPIトークンを作成 ↗します。
- JWKsエンドポイントを手動でクエリして、JWKsが期待される場所と形式に存在することを確認します。
- JWKsの更新を自動化するためのワーカーを作成します。
- API Shield設定を更新するために使用するAPIキーを格納するためのワーカーシークレットを作成します。
- ワーカーをスケジュールして、JWKsを自動的に更新します。
アイデンティティプロバイダーのURLを見つけ、curlとjqを使用して鍵を取得します。あなたのURLは発行者の鍵だけでなく、他の情報も返す可能性があるため、Cloudflareはjqを使用して応答をフィルタリングし、鍵のみを返すことを推奨しています。JWKsにkeysオブジェクトがない場合は、提供されたワーカーのサンプルコードを更新する必要があります。
curl https://<your-team-name>.cloudflareaccess.com/cdn-cgi/access/certs -s | jq .keys[ { "kid": "ca96ae653935dbfb49b4e19de600cc5f9d5c63e3ac2dbee406ed4bf0ae100cce", "kty": "RSA", "alg": "RS256", "use": "sig", "e": "AQAB", "n": "9dG9Ph4ffncvEA9FO9pVMfJ1dh_5mtuyiIE4ap9ScrufVPq1I34St_dhcFavKiytK7Id7gTlgQgaouoJ0I5OJ_bytgX-B7oOUQHO-nJOAMycORXN8ZNaMBPKg9nBLL_BFY0YX5HggqrkXkZjJ--R4JpB30ENS8A6hxmEJ__yGMZTE2LHZoiYj9iyGNu3s3JflAoRlmziI8LsFXwyFAJUWRZq4SkSfyrRJ89pXPxIqBn9uYBtnxWzUpWG3xKZu0JAbi9YiwFCJrSe_CarvpARoWsOldtrty5yT1yJ1PZlImlF-yuEwjOoZxeib4WSidABZH0O3pbDACo8MfxR5rghHQ" }, { "kid": "1e590a6dcd60e3e2306c21eca19144c59d591531267a3ebde8d521f40894329d", "kty": "RSA", "alg": "RS256", "use": "sig", "e": "AQAB", "n": "6uj6PgDq-bPsdFjiQ6M3yaxMxBUnnYj20xtLciHNafqrygAjnZKjl8LfCO_mtZ7jxfJNCARsz0L3sF9LAtARZqcsUvYLUlNDzflwNTe8woCT7yw0Ml2ZV5BWDbc3izEQnvjlBDGWv9p5jv-D-YNExtIzZKsRKyoy7hSu5FhyxmPfiAXo8b67f0dNy8V8HZfQJ5i9VGyK4Z5xKM-FjHOrC2uIbhzUE6wDe_0M23RTCxj7ZxzXUzZzc-_EBjmZDAI3tI2zBYymO55_gw8zHrNsZ4-32YvNTjBAiTLsjvKlsvNtPTN8q3saoZJWQMSiMi8dRalgA6pUDgcNs5lB9E7tWw" }]- 新しいワーカーを作成します。
- 以下の例のコードを新しいワーカーにコピー&ペーストし、既存のコードを完全に置き換えます。
- 現在のゾーンIDをあなたのゾーンIDに置き換えます。
- 現在のトークン検証設定IDをあなたのトークン検証設定に置き換えます。
- 現在のアイデンティティプロバイダーのURLをあなたのアイデンティティプロバイダーの鍵URLに置き換えます。
- JWKs URLが
keys以外のJSONオブジェクトで鍵を返す場合は、fetchCredentials()関数を更新して鍵データのみを返すようにします。 - 作成 > デプロイを選択します。
- ワーカー設定で、変数に移動し、作成したAPIトークンの値を持つ
CF_API_TOKENという名前の環境変数を追加します。 - ワーカートリガーで、ワーカーにcronトリガーを割り当てます。Cloudflareは、最新の鍵を常に持ち、アイデンティティプロバイダーによる即時の鍵ローテーションが最小限のダウンタイムを引き起こすように、頻繁な更新間隔を推奨しています。
/** * トークン検証資格情報を更新します * * この例は、Cloudflare Workersのcronトリガーを使用して * トークン設定のJWKsを自動的にローテーションする方法を示しています。 * * このワーカーを設定するには: * * 1. `token_config_id`を更新するトークン設定のIDに置き換えます * 2. `zone_id`をあなたのゾーンIDに置き換えます * 3. `url`を使用したいJWKsを持つ公開アクセス可能なURLに置き換えます * 4. "Zone.API Gateway Edit"権限を持つ新しいAPIトークンを作成し、`CF_API_TOKEN`という名前のシークレットとして追加します (https://developers.cloudflare.com/workers/configuration/secrets/を参照) * * このワーカーはGETおよびPOSTリクエストも処理します: * - GETは提供されたURLから資格情報を取得して表示します (`GET https://random-worker-name-c134.example.workers.dev/`) * - POSTは更新をトリガーし、その更新のCloudflare API応答を返します (`POST https://random-worker-name-c134.example.workers.dev/`) * * これらのメソッドを使用して、ワーカーが正しく設定されているかをテストできます。 * * ワーカーを設定した後、定期的に実行するためのcronトリガーを作成できます。 * cronトリガーの詳細については、https://developers.cloudflare.com/workers/configuration/cron-triggers/を参照してください。 * * ワーカーについての詳細は、https://developers.cloudflare.com/workers/を参照してください。 */
var zone_id = "760549bc17c54280d6e6ae256c3dd6ae";var token_config_id = "91007e72-8f17-46b7-a223-5e57bd333b78";var url = "https://cfdata.cloudflareaccess.com/cdn-cgi/access/certs"; // JWKs
/** * fetchCredentialsは、上記で定義されたURLを使用して新しいトークン設定の資格情報を取得します。 * これにより、資格情報を含むJSON文字列が返されます。 * * この関数を使用して資格情報を取得し、解析します。 * * @returns {string} credentials */async function fetchCredentials() { var requestOptions = { method: "GET", redirect: "follow", }; const keys = await fetch(url, requestOptions) .then((e) => e.json()) .then((e) => e.keys); return JSON.stringify({ keys: keys });}
/** * updateCredentialsは、Cloudflare APIを使用してトークン設定の資格情報を更新します。 * 資格情報はfetchCredentialsを使用して取得され、必要な処理も行われます。 * * @param {string} bearer "Zone.API Gateway Edit"権限を持つCloudflare API Bearerトークン * @returns {string} 更新リクエストのCloudflare API応答 */async function updateCredentials(bearer) { // 資格情報更新のためのCloudflare APIエンドポイント const url = `https://api.cloudflare.com/client/v4/zones/${zone_id}/api_gateway/token_validation/${token_config_id}/credentials`; const init = { body: await fetchCredentials(), method: "PUT", headers: { Authorization: `Bearer ${bearer}`, "content-type": "application/json;charset=UTF-8", }, }; const response = await fetch(url, init); return response.text();}
// イベントハンドラーを含むデフォルトオブジェクトをエクスポートexport default { /** * fetchは、ワーカーに直接行われたリクエストを処理します。 * */ async fetch(request, env, ctx) { let responseBody = ""; if (request.method === "GET") { responseBody = await fetchCredentials(); } else if (request.method === "POST") { responseBody = await updateCredentials(env.CF_API_TOKEN); } return new Response(responseBody, { headers: { "content-type": "application/json;charset=UTF-8" }, }); },
/** * scheduledは、cronトリガーのハンドラーです。 * * 詳細については、https://developers.cloudflare.com/workers/configuration/cron-triggers/を参照してください。 * */ async scheduled(request, env, ctx) { ctx.waitUntil(updateCredentials(env.CF_API_TOKEN)); },};