チャレンジ:プライベートアクセストークン
2022年6月9日

プライベートアクセストークンは、HTTPリクエストが正当なデバイスから来たものであることを、個人を特定することなく証明できる強力なツールです。この証明により、CAPTCHAを表示する頻度を減らすことができます。設定もテストもシンプルですから、本課題では、プライベートアクセストークンをご自身のサーバでお試しになるようお勧めしております。
始める前に、「Replace CAPTCHAs with Private Access Tokens」を必ずご覧になり、この機能の概要をご確認ください
Replace CAPTCHAs with Private Access Tokens
Don’t be captured by CAPTCHAs! Private Access Tokens are a powerful alternative that help you identify HTTP requests from legitimate devices and people without compromising their identity or personal information. We’ll show you how your app and server can take advantage of this tool to add...
課題を始める
サーバにプライベートアクセストークンのサポートを追加するのは簡単です。サーバrは、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-directoryLearn more about Private Access Tokens and Cloudflare
Learn more about Private Access Tokens and Fastly
トークンチャレンジと回収 チャレンジを送信するには、「PrivateToken」チャレンジを含む「WWW-Authenticate」ヘッダでクライアントが行うリクエストに対して、サーバがHTTP401レスポンスをポストする必要があります。このヘッダは、base64urlエンコーディングにTokenChallenge構造を含む「challenge」と、base64urlエンコーディングによるトークン発行者の公開鍵を含む「token-key」という2つの属性を含んでいます。
WWW-Authenticate: PrivateToken challenge=, token-key= TokenChallenge構造は、トークンのタイプ、発行者のホスト名、チャレンジにバインドするためのオプションのコンテキスト、サーバのホスト名を含みます。iOS16と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=注:トークンチャレンジを送信するときは、メインページのロードをブロックしないようにしてください。トークンをサポートしていないクライアントが、まだみなさんのWebサイトにアクセスできることを確認してください。
Adopt the "PrivateToken" HTTP authentication scheme
Issuance Protocol for Publicly Verifiable Tokens
プライベートアクセストークンの設定方法がわかったところで、ご自身のWebサイトでトークンチャレンジを送信する方法を検討してみましょう。プライベートアクセストークンをサポートしているクライアントとサポートしていないクライアントであなたのサイトをテストして、プライベートアクセストークンをサポートしていないクライアントに対してのみCAPTCHAを表示させる方法を見つけてください。
この機能の採用するにあたっての質問がありますか?木曜日の朝にプライベートアクセストークンに関するQ&Aをご確認ください。また、CAPTCHAなしのエクスペリエンスをハッシュタグ「#WWDC22Challenges」 をつけてTwitterで共有することもお忘れなく。