← Cloudflare API Shield / api-shield / security / jwt-validation
Nakonfigurujte Worker
Pomocí Workeru můžete automaticky udržovat aktuální veřejný klíč poskytovatele identity v konfiguraci ověřování JWT.
Předpoklady
- Najděte ID své zóny. Toto ID najdete v přehledu zóny v Cloudflare dashboard ↗.
- Najděte adresu URL sady JSON Web Key Set (JWKs) svého poskytovatele identity. Poskytovatelé identity ji obvykle uvádějí v nastavení Open Authorization (OAuth).
- Vytvořte konfigurace ověřování tokenu.
- Vytvoření nového API tokenu ↗ s API Gateway
Writeoprávnění.
Proces
Koncový bod JWKs musíte ručně dotázat, abyste ověřili, že JWKs existuje na očekávaném místě a ve správném formátu. Poté vytvořte Worker, který automatizuje aktualizaci JWKs, a Worker Secret , ve kterém uložíte API klíč používaný k aktualizaci nastavení API Shield. Poté můžete Worker naplánovat tak, aby JWKs automaticky aktualizoval.
Ručně dotazovat koncový bod JWKs
Najděte adresu URL svého poskytovatele identity a načtěte klíče pomocí curl a jq. Vaše URL může vracet víc než jen klíče vydavatele, proto Cloudflare doporučuje použít jq , chcete-li odpověď omezit tak, aby vracela pouze klíče. Musíte upravit dodaný ukázkový kód Workeru, pokud vaše JWKs nemají keys objekt.
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"
}
]Nakonfigurujte Worker
-
Zkopírujte a vložte níže uvedený ukázkový kód do nového Workeru a zcela tak nahraďte veškerý stávající kód.
-
ID aktuální zóny nahraďte ID vaší zóny.
-
ID aktuální konfigurace ověřování tokenu nahraďte vlastní konfigurací ověřování tokenu.
-
Adresu URL aktuálního poskytovatele identity nahraďte adresou URL klíče vašeho poskytovatele identity.
-
Pokud adresa URL JWKs vrací klíče v jiném JSON objektu než
keys, aktualizujtefetchCredentials()funkci, která vrátí jen klíčová data. -
Vyberte Vytvořit > Nasadit.
-
V části Worker settings přejděte na Proměnné a přidejte proměnnou prostředí s názvem
CF_API_TOKENs hodnotou API tokenu, který jste vytvořili. -
V části Worker Triggers přiřaďte Cron Trigger do Workeru. Cloudflare doporučuje častý interval aktualizací, abyste měli vždy nejnovější klíče a aby okamžitá rotace klíčů u vašeho poskytovatele identity způsobila jen minimální výpadek.
Ukázkový kód v JavaScriptu/** * Update Token Validation Credentials * * This example shows how a Cloudflare Workers cron trigger can be used to * automatically rotate a JWKs for a Token Configuration. * * To configure this Worker: * * 1. Replace `token_config_id` with the ID of the Token Config to update * 2. Replace `zone_id` with your Zone ID * 3. Replace `url` with a publicly accessible URL with the JWKs you want to use * 4. Create a new API Token with "Zone.API Gateway Edit" permissions and add it as a secret with the name `CF_API_TOKEN` (see https://developers.cloudflare.com/workers/configuration/secrets/) * * This worker also handles GET and POST requests: * - GET will fetch and show the credentials from the provided URL (`GET https://random-worker-name-c134.example.workers.dev/`) * - POST triggers an update and returns the Cloudflare API response of that update (`POST https://random-worker-name-c134.example.workers.dev/`) * * Use these to test that the Worker is properly configured. * * After setting up the worker, you can create a cron trigger to run it periodically. * For more information on cron triggers, refer to https://developers.cloudflare.com/workers/configuration/cron-triggers/ * * Learn more about Workers at 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 fetches new Token Configuration credentials using the URL defined above. * This returns a JSON string with the credentials. * * Use this function to fetch and parse credentials. * * @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 updates Token Configuration credentials using the Cloudflare API. * Credentials are fetched using fetchCredentials, which also does any required processing. * * @param {string} bearer Cloudflare API Bearer token with "Zone.API Gateway Edit" permissions * @returns {string} Cloudflare API response from the update request */ async function updateCredentials(bearer) { // Cloudflare API endpoint for credentials update const url = `https://api.cloudflare.com/client/v4/zones/${zone_id}/token_validation/config/${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 a default object containing event handlers export default { /** * fetch handles requests made directly to the Worker. * */ 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 is the handler for cron triggers. * * For details, refer to https://developers.cloudflare.com/workers/configuration/cron-triggers/ * */ async scheduled(request, env, ctx) { ctx.waitUntil(updateCredentials(env.CF_API_TOKEN)); }, };