挑战:私有访问令牌
2022 年 6 月 9 日
私有访问令牌非常强大,它可以证明 HTTP 请求何时来自合法设备,而不泄露任何人的身份。这个证明可以帮助降低您需要向相关人士出示验证码的频率。其设置和测试很简单,因此,我们诚邀您接受这项挑战,在自己的服务器上试用私有访问令牌。
在开始之前,请务必观看“Replace CAPTCHAs with Private Access Tokens”,大致了解这项功能。
以私有访问令牌取代 CAPTCHA
Watch now开始挑战
要在服务器上添加对私有访问令牌的支持,做法很简单:您的服务器可以发送 HTTP 身份验证质询,请求客户端提供由您信任的令牌颁发者签名的令牌。然后,您可以使用该颁发者的公钥验证令牌。
选择令牌颁发者
要采用私有访问令牌,首先需要选择令牌颁发者。您的服务器必须在发送给客户端的质询中包含令牌颁发者的主机名和公钥。在使用 iOS 16 和 macOS Ventura 时,可以使用 Cloudflare 和 Fastly 的令牌颁发者进行测试。对于每个颁发者,可以使用 URL 格式 https://<issuer name>/.well-known/token-issuer-directory
查找公钥。可以从服务器获取以下 URL 之一以取得颁发者信息:
Cloudflare — https://demo-pat.issuer.cloudflare.com/.well-known/token-issuer-directory
Fastly — https://demo-issuer.private-access-tokens.fastly.com/.well-known/token-issuer-directory
Learn more about Private Access Tokens and Cloudflare
Learn more about Private Access Tokens and Fastly
令牌质询和兑换 要发送质询,您的服务器需要向客户端发出的请求发布 HTTP 401 响应,其中含有包括 "PrivateToken" 质询的 "WWW-Authenticate" 标头。此标头包含两个属性:"challenge",其中包含 base64url 编码的 TokenChallenge 结构;以及 "token-key",其中包含使用 base64url 编码的令牌颁发者的公钥。
WWW-Authenticate: PrivateToken challenge=, token-key=
TokenChallenge 结构包含令牌的类型、颁发者的主机名、绑定到质询的可选上下文,以及服务器的主机名。iOS 16 和 macOS Ventura 支持 2 类令牌,它使用可公开验证的 RSA 盲签名。
struct {
uint16_t token_type; // 0x0002, in network-byte order
uint16_t issuer_name_length; // Issuer name length, in network-byte order
char issuer_name[]; // Hostname of the token issuer
uint8_t redemption_context_length; // Redemption context length (0 or 32)
uint8_t redemption_context[]; // Redemption context, either 0 or 32 bytes
uint16_t origin_info_length; // Origin info length, in network-byte order
char origin_info[]; // Hostname of your server
} TokenChallenge;
令牌响应包含在 "Authorization" 标头中。这包括 "token" 属性,是一个使用 base64url 编码的 RSA 盲签名令牌。使用令牌颁发者的公钥来验证此令牌。
Authorization: PrivateToken token=
注:当您发送令牌质询时,不要阻止主页加载。确保所有不支持令牌的客户端仍然可以访问您的网站!
Adopt the "PrivateToken" HTTP authentication scheme
Issuance Protocol for Publicly Verifiable Tokens
现在您已经知道如何设置私有访问令牌,请尝试在自己的网站中发送令牌质询。使用支持以及不支持私有访问令牌的客户端测试您的网站,并了解如何让您的验证码只显示给不支持私有访问令牌的客户端。
对采用此功能有疑问?请周四上午查看我们关于私有访问令牌的问答。别忘了在 Twitter 上使用话题标签 #WWDC22Challenges 与我们分享您的免验证码体验!