WebAuthn(Web 身份验证)是 W3C 标准,利用公钥密码学实现安全、无密码且防网络钓鱼的身份验证,广泛用于 passkey 以提升安全性和用户体验。然而,使用 WebAuthn 对用户进行身份验证只是第一步——身份验证成功后,您通常还需要在多个 API 端点上授权用户的操作。
本文将介绍:
- 使用 WebAuthn 进行基于 passkey 的身份验证。
- 从 WebAuthn 服务器接收 bearer token。
- 使用返回的 bearer token 授权后续 HTTP 请求。
1. 理解 WebAuthn 身份验证流程
WebAuthn 围绕公钥密码学和安全存储在客户端(如浏览器或设备中的 passkey)的凭据运作。身份验证流程通常包含以下步骤:
第 1 步:发起身份验证- 客户端(浏览器/应用)向服务器请求 WebAuthn 挑战。
- 服务器生成挑战并发送给客户端。
- 浏览器使用 WebAuthn API(
navigator.credentials.get)利用存储在 passkey 中的私钥对挑战进行签名。 - 签名的断言发回服务器。
- WebAuthn 服务器使用对应的公钥验证断言。
- 若有效,服务器对用户进行身份验证。
至此,您已确认用户身份,但仍需一种方式来授权访问您的 API。
2. WebAuthn 验证成功后返回 Bearer Token
若希望身份验证成功后服务器发送一个 bearer token 用于建立新的 WebSocket 或 HTTP 连接,请传入参数 token = true。示例:
{
"username": "alice@example.com", "token": true
}
身份验证成功后,服务器将发送如下响应:
{
"verified": "ok",
"authentication": {
"token": "C760C1C39E3D4E829693A13F18F5CFDE537B516336FC48F7BAB0276176F9E6DE"
}
}
当请求未获授权且将被断开连接时,会触发 OnWebAuthnUnauthorized 事件,您可在此配置哪些端点需要 WebAuthn 身份验证,哪些不需要。
为何使用 Bearer Token?
- 无需在每次请求时重新验证身份。
- 支持跨微服务的无状态授权。
- 与现代 API 安全模式无缝集成。
3. 使用 Bearer Token 进行 API 授权
获得新 token 后,只需在请求中发送包含此 bearer token 的授权头。您可以使用 TsgcHTTP1Client 的 CustomHeaders 属性配置 Bearer Token。示例:
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. 端到端流程概览
以下是完整的高层次流程:

