コンテンツにスキップ

ワーカーの設定

ワーカーを使用して、アイデンティティプロバイダーの最新の公開鍵をJWT検証設定に自動的に保持します。

前提条件

プロセス

  1. JWKsエンドポイントを手動でクエリして、JWKsが期待される場所と形式に存在することを確認します。
  2. JWKsの更新を自動化するためのワーカーを作成します。
  3. API Shield設定を更新するために使用するAPIキーを格納するためのワーカーシークレットを作成します。
  4. ワーカーをスケジュールして、JWKsを自動的に更新します。

JWKsエンドポイントを手動でクエリする

アイデンティティプロバイダーのURLを見つけ、curljqを使用して鍵を取得します。あなたのURLは発行者の鍵だけでなく、他の情報も返す可能性があるため、Cloudflareはjqを使用して応答をフィルタリングし、鍵のみを返すことを推奨しています。JWKsにkeysオブジェクトがない場合は、提供されたワーカーのサンプルコードを更新する必要があります。

JWKsエンドポイントをクエリする
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"
}
]

ワーカーの設定

  1. 新しいワーカーを作成します。
  2. 以下の例のコードを新しいワーカーにコピー&ペーストし、既存のコードを完全に置き換えます。
  3. 現在のゾーンIDをあなたのゾーンIDに置き換えます。
  4. 現在のトークン検証設定IDをあなたのトークン検証設定に置き換えます。
  5. 現在のアイデンティティプロバイダーのURLをあなたのアイデンティティプロバイダーの鍵URLに置き換えます。
  1. JWKs URLがkeys以外のJSONオブジェクトで鍵を返す場合は、fetchCredentials()関数を更新して鍵データのみを返すようにします。
  2. 作成 > デプロイを選択します。
  3. ワーカー設定で、変数に移動し、作成したAPIトークンの値を持つCF_API_TOKENという名前の環境変数を追加します。
  4. ワーカートリガーで、ワーカーにcronトリガーを割り当てます。Cloudflareは、最新の鍵を常に持ち、アイデンティティプロバイダーによる即時の鍵ローテーションが最小限のダウンタイムを引き起こすように、頻繁な更新間隔を推奨しています。
JavaScriptの例コード
/**
* トークン検証資格情報を更新します
*
* この例は、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));
},
};