WebAuthn(Web Authentication)は公開鍵暗号方式を使用したセキュアでパスワードレス、フィッシング耐性のある認証を実現する W3C 標準です。セキュリティとユーザーエクスペリエンスを向上させるため、パスキーと組み合わせて広く使用されています。しかし、WebAuthn でユーザーを認証することは最初のステップに過ぎません。認証成功後、複数の API エンドポイントにわたってユーザーの操作を認可する必要があります。
本記事では、以下の方法を説明します:
- パスキーベースの認証に WebAuthn を使用する。
- WebAuthn サーバーからベアラートークンを受け取る。
- 受け取ったベアラートークンを使用してその後の HTTP リクエストを認可する。
1. WebAuthn 認証フローの理解
WebAuthn は公開鍵暗号方式と、クライアント(ブラウザやデバイス内のパスキーなど)に安全に保存されたクレデンシャルを中心に構築されています。認証フローは一般的に以下のステップを含みます:
ステップ 1: 認証の開始- クライアント(ブラウザ・アプリ)がサーバーに WebAuthn チャレンジをリクエストします。
- サーバーがチャレンジを生成してクライアントに送信します。
- ブラウザは WebAuthn API(
navigator.credentials.get)を使用して、パスキーに保存されている秘密鍵でチャレンジに署名します。 - 署名されたアサーションがサーバーに送り返されます。
- WebAuthn サーバーは対応する公開鍵を使用してアサーションを検証します。
- 有効であれば、サーバーがユーザーを認証します。
この時点で、ユーザーが誰であるかは確認できましたが、API へのアクセスを認可する方法が別途必要です。
2. WebAuthn 成功後にベアラートークンを返す
認証が成功した後にサーバーから新しい WebSocket または HTTP 接続を開くためのベアラートークンを送信させたい場合は、パラメーター token = true を渡します。例:
{
"username": "alice@example.com", "token": true
}
認証が成功すると、サーバーは以下のようなレスポンスを送信します:
{
"verified": "ok",
"authentication": {
"token": "C760C1C39E3D4E829693A13F18F5CFDE537B516336FC48F7BAB0276176F9E6DE"
}
}
OnWebAuthnUnauthorized イベントはリクエストが認可されておらず切断されるときに呼び出されます。ここで、どのエンドポイントが WebAuthn 認証を必要とし、どのエンドポイントが必要としないかを設定できます。
ベアラートークンを使用する理由
- リクエストごとの再認証が不要になります。
- マイクロサービス間でステートレスな認可が可能になります。
- 現代的な API セキュリティパターンとシームレスに統合できます。
3. API 認可にベアラートークンを使用する
新しいトークンを取得したら、このベアラートークンを含む authorization ヘッダーを送信するだけです。TsgcHTTP1Client の CustomHeaders プロパティを使用してベアラートークンを設定できます。例:
procedure GetHTTPRequest(const aURL: string; const aToken: string): string;
var
oHTTP: TsgcHTTP1Client;
begin
oHTTP := TsgcHTTP1Client.Create(nil);
Try
oHTTP.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + aToken);
result := oHTTP.Get(aURL);
Finally
oHTTP.Free;
End;
end;
4. エンドツーエンドフローの概要
完全な高レベルシーケンスは以下のとおりです:

