URL トークンの検証を有効化する

トークンの検証により、期限が定められた URL を作成できます。トークンは、ウェブアプリケーション内で生成され、クエリー文字列の URL に追加されます。リクエストは、オリジンサーバーではなく、Fastly のエッジで認証されます。Fastly がその URL に対するリクエストを受け取ると、コンテンツの配信前にトークンが検証されます。設定可能な期間が過ぎると、トークンは期限切れとなります。

カスタム VCL を追加する

トークンの検証を有効化するには、vcl_recv という名前の Varnish 設定を作成し、次のサンプルコードを追加してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# only do this once per request
if (req.restarts == 0) {
  declare local var.token STRING;
  declare local var.token_expiration STRING;
  declare local var.token_signature STRING;

  # extract the token
  set var.token = subfield(req.url.qs, "token", "&");

  # make sure there is a token
  if (var.token == "") {
    error 403;
  }

  # make sure there is a valid expiration and signature
  if (var.token !~ "^(\d{10,11})_([a-f0-9]{40})$") {
    error 403;
  }

  # extract token expiration and signature
  set var.token_expiration = re.group.1;
  set var.token_signature = re.group.2;

  # make sure the signature is valid
  if (!digest.secure_is_equal(var.token_signature, regsub(digest.hmac_sha1(digest.base64_decode("YOUR%SECRET%KEY%IN%BASE64%HERE"), req.url.path + var.token_expiration), "^0x", ""))) {
    error 403;
  }

  # make sure the expiration time has not elapsed
  if (time.is_after(now, std.integer2time(std.atoi(var.token_expiration)))) {
    error 410;
  }
}

上記のカスタム VCL コードは以下の2点をチェックします。

  • 提供された署名が、トークンの署名と一致しているか。
  • 現在の時刻が、トークンで指定された有効期限より前であるか。

署名が無効の場合、Varnish は403レスポンスを返します。署名は有効であるものの、有効期限が過ぎている場合、Varnish は410レスポンスを返します。異なるレスポンスコードは、デバッグに役立ちます。

トークン情報

?token= GET パラメーターにはトークンが入ることを想定しています。トークンは [expiration]_[signature] の形式を取り、以下のようになります。

1
1441307151_4492f25946a2e8e1414a8bb53dab8a6ba1cf4615

トークンを使用する完全なリクエスト URL は、以下のようになります。

1
http://www.example.com/foo/bar.html?token=1441307151_4492f25946a2e8e1414a8bb53dab8a6ba1cf4615

署名の検証

digest.hmac_sha1 にあるキーは、任意の文字列です。この例のキーは、openssl rand -base64 32 コマンドで生成されたものです。サンプルキー YOUR%SECRET%KEY%IN%BASE64%HERE は、利用しようとすると意図的にエラーが発生するようになっています。ランダム生成されたシークレットキーで置換する必要があります。

アプリケーションの設定

アプリケーションにカスタムコードを記述し、トークンを生成して Varnish で認証する必要があります。GitHub の トークン関数リポジトリでサンプルを提供しています。リポジトリのサンプルを確認しながらアプリケーションでカスタムトークンの生成方法を学べます。

テスト

設定をテストするには、アプリケーションにより生成されたトークンをクエリー文字列の URL に追加します。例えば、次のようにします。

http://www.example.com/foo/bar.html?token=1441307151_4492f25946a2e8e1414a8bb53dab8a6ba1cf4615

トークンが有効ならば、通常のレスポンスを受け取ります。無効の場合、403レスポンスを受け取ります。

NUL バイトのトラブルシューティング

シークレットキーに NUL バイトが含まれないことを確認してください。Base64-decoded 文字列に NUL バイト (0x00) が含まれている場合、そのバイトとその後のバイトは、レスポンスに含まれません。詳細については、Base64 デコーディングを参照してください。

キャッシュキーからトークンクエリー文字列を除外する

すべてのトークンが動的で異なる場合、キャッシュ キーからトークンのクエリー文字列を除外して、キャッシュ ヒット率に影響を与える可能性を回避できます。これを行うには、上記のサンプルコード に加えて、カスタム VCL に以下のコードを追加する必要があります。

1
2
/* strip out the token querystring so Fastly does not vary the cache. */
set req.url = querystring.filter(req.url, "token");
Back to Top