コンテンツにスキップ

プライベート画像の提供

署名付きURLトークンを使用することで、プライベート画像を提供できます。画像が署名付きURLを必要とする場合、そのトークンがない限り画像にはアクセスできません。ただし、常にパブリックアクセスを許可するように設定されたバリアントがリクエストされている場合は除きます。

  1. Cloudflareダッシュボードにログインし、アカウントを選択します。
  2. Images > Keysを選択します。
  3. キーをコピーし、それを使用して期限付きのトークン化されたURLを生成します。

以下の例では、署名トークンなしの通常のURLを受け取り、1日後に期限切れになるトークン化されたURLを返すWorkerを使用しています。ただし、この有効期限は、const EXPIRATIONの値を変更することで、必要に応じて設定できます。

const KEY = 'YOUR_KEY_FROM_IMAGES_DASHBOARD';
const EXPIRATION = 60 * 60 * 24; // 1日
const bufferToHex = buffer =>
[...new Uint8Array(buffer)].map(x => x.toString(16).padStart(2, '0')).join('');
async function generateSignedUrl(url) {
// `url`は完全なimagedelivery.netのURLです
// 例: https://imagedelivery.net/cheeW4oKsx5ljh8e8BoL2A/bc27a117-9509-446b-8c69-c81bfeac0a01/mobile
const encoder = new TextEncoder();
const secretKeyData = encoder.encode(KEY);
const key = await crypto.subtle.importKey(
'raw',
secretKeyData,
{ name: 'HMAC', hash: 'SHA-256' },
false,
['sign']
);
// `url`に有効期限の値を追加します
const expiry = Math.floor(Date.now() / 1000) + EXPIRATION;
url.searchParams.set('exp', expiry);
// `url`は現在次のようになります
// https://imagedelivery.net/cheeW4oKsx5ljh8e8BoL2A/bc27a117-9509-446b-8c69-c81bfeac0a01/mobile?exp=1631289275
const stringToSign = url.pathname + '?' + url.searchParams.toString();
// 例えば、/cheeW4oKsx5ljh8e8BoL2A/bc27a117-9509-446b-8c69-c81bfeac0a01/mobile?exp=1631289275
// 署名を生成します
const mac = await crypto.subtle.sign('HMAC', key, encoder.encode(stringToSign));
const sig = bufferToHex(new Uint8Array(mac).buffer);
// そしてそれを`url`に追加します
url.searchParams.set('sig', sig);
return new Response(url);
}
addEventListener('fetch', event => {
const url = new URL(event.request.url);
const imageDeliveryURL = new URL(
url.pathname.slice(1).replace('https:/imagedelivery.net', 'https://imagedelivery.net')
);
event.respondWith(generateSignedUrl(imageDeliveryURL));
});