Cloudflare Docs
Support
Support
Visit Support on GitHub
Set theme to dark (⇧+D)

配置令牌认证

​​ 配置令牌认证

了解如何使用 Cloudflare 令牌身份验证设置对文件、文档和媒体的访问权限。

​​ 本文内容


​​ 概述

Cloudflare 令牌身份验证允许您将文档、文件和媒体的访问权限限制为选定用户,而无需他们注册。 这有助于保护付费/受限内容免遭窃取和未经授权的共享。

有两个选项,可以通过 Cloudflare Workers 或 Cloudflare 防火墙规则来配置令牌身份验证。


​​ 选项 1:使用 Cloudflare Workers 进行配置

查看以下 Cloudflare Workers 文档以配置令牌身份验证:


​​ 选项 2:使用防火墙规则进行配置

通过防火墙规则配置令牌身份验证需要是Business或企业版帐户。 要使用防火墙规则配置令牌身份验证:

  1. 登录到 Cloudflare 仪表板。
  2. 点击要启用令牌身份验证的域的相应 Cloudflare 帐户。
  3. 点击防火墙应用程序。
  4. 点击防火墙规则选项卡。
  5. 点击创建防火墙规则
  6. 点击表达式预览上方的编辑表达式链接以切换到表达式预览编辑器。

以下示例阐述的规则会阻止任何在特定主机名和 URL 路径没有通过HMAC 密钥验证的访问者。令牌认证所需的详细信息包括:

  • 您希望进行身份验证的路径(例如 test.domain.com/download/cat.jpg),
  • 您希望令牌具有的参数名称(例如verify),以及
  • 所需的令牌过期时间(如果有)(例如 5 和 20 分钟)。

对于以下示例 URL,

test.domain.com/download/cat.jpg?verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3D

示例防火墙规则如下所示:

(http.host eq “test.domain.com” and not is_timed_hmac_valid_v0(“mysecrettoken”, http.request.uri,10800, http.request.timestamp.sec,8))

此示例防火墙规则的组件(使用上面的示例 URL)包括:

  • Token key = mysecrettoken
  • Token expiration time = 10800 seconds
  • Http.request.uri = /download/cat.jpg
  • Http.request.timestamp.sec = 1484063787
  • Separator: len(?verify=) = 8

要使用此防火墙规则为路径生成令牌:

​​ Python 3.8

import hmac
import base64
import urllib.parse
import time
from hashlib import sha256
message = "/download/cat.jpg"
secret = "mysecrettoken"
separator = "?verify="
timestamp = str(int(time.time()))
digest = hmac.new((secret).encode('utf8'), "{}{}".format(message,timestamp).encode('utf8'), sha256)
token = urllib.parse.quote_plus(base64.b64encode(digest.digest()))
print("{}{}{}-{}".format(message, separator, timestamp, token))

​​ Python 2.7

import hmac
import base64
import time
import urllib
from hashlib import sha256
message = "/download/cat.jpg"
secret = "mysecrettoken"
separator = "verify"
timestamp = str(int(time.time()))
digest = hmac.new(secret, message + timestamp, sha256)
param = urllib.urlencode({separator: '%s-%s' % (timestamp, base64.b64encode(digest.digest()))})
print("{}{}".format(message, param))

​​ PHP

$message = "/download/cat.jpg";
$secret = "mysecrettoken";
$separator = "?verify=";
$time = time();
$token = $time . "-" . urlencode(base64_encode(hash_hmac("sha256", $message . $time, $secret, true)));
echo($message . $separator . $token);

​​ 实现令牌创建

实现令牌创建需要在您的源服务器上输入以下代码:

​​ PHP Version

<?php
// Generate valid URL token$secret = "thisisasharedsecret";
$time   = time();
$token  = $time . "-" . urlencode(base64_encode(hash_hmac("sha256", "/download/private.jpg$time", $secret, true)));param   = "verify=" . $token;
?>

​​ Python Version

import hmac
import base64
import time
import urllib
from hashlib import sha256
secret = "thisisasharedsecret"
time   = str(int(time.time()))
digest = hmac.new(secret, "/download/cat.jpg" + time, sha256)
param  = urllib.urlencode({'verify': '%s-%s' % (time, base64.b64encode(digest.digest()))})

这将生成一个 URL 参数,例如:

verify=1484063137-IaLGSmELTvlhfd0ItdN6PhhHTFhzx73EX8uy%2FcSDiIU%3D

然后您需要将其附加到 domain.com/download/* 路径下的任何 URL。 例如:

/download/cat.jpg?verify=1484063787-9JQB8vP1z0yc5DEBnH6JGWM3mBmvIeMrnnxFi3WtJLE%3D

请注意,令牌参数需要是查询字符串中的最后一个参数。 您可以通过在 Cloudflare 仪表板中的防火墙规则应用程序下启用 WAF 模拟规则并且监控 WAF 日志,来测试 URL 是否在服务器上正确生成。