配置令牌认证
配置令牌认证
了解如何使用 Cloudflare 令牌身份验证设置对文件、文档和媒体的访问权限。
本文内容
概述
Cloudflare 令牌身份验证允许您将文档、文件和媒体的访问权限限制为选定用户,而无需他们注册。 这有助于保护付费/受限内容免遭窃取和未经授权的共享。
有两个选项,可以通过 Cloudflare Workers 或 Cloudflare 防火墙规则来配置令牌身份验证。
选项 1:使用 Cloudflare Workers 进行配置
查看以下 Cloudflare Workers 文档以配置令牌身份验证:
- 配置 Worker
- 使用 Auth with Headers 模板
选项 2:使用防火墙规则进行配置
通过防火墙规则配置令牌身份验证需要是Business或企业版帐户。 要使用防火墙规则配置令牌身份验证:
- 登录到 Cloudflare 仪表板。
- 点击要启用令牌身份验证的域的相应 Cloudflare 帐户。
- 点击防火墙应用程序。
- 点击防火墙规则选项卡。
- 点击创建防火墙规则。
- 点击表达式预览上方的编辑表达式链接以切换到表达式预览编辑器。
以下示例阐述的规则会阻止任何在特定主机名和 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 hmacimport base64import urllib.parseimport timefrom hashlib import sha256message = "/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 hmacimport base64import timeimport urllibfrom hashlib import sha256message = "/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 hmacimport base64import timeimport urllibfrom 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 是否在服务器上正确生成。