使用 PassKey 进行授权

· 功能

WebAuthn(Web 身份验证)是 W3C 标准,利用公钥密码学实现安全、无密码且防网络钓鱼的身份验证,广泛用于 passkey 以提升安全性和用户体验。然而,使用 WebAuthn 对用户进行身份验证只是第一步——身份验证成功后,您通常还需要在多个 API 端点上授权用户的操作。

本文将介绍:

1. 理解 WebAuthn 身份验证流程

WebAuthn 围绕公钥密码学和安全存储在客户端(如浏览器或设备中的 passkey)的凭据运作。身份验证流程通常包含以下步骤:

第 1 步:发起身份验证 第 2 步:客户端凭据断言 第 3 步:服务器端验证

至此,您已确认用户身份,但仍需一种方式来授权访问您的 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?

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. 端到端流程概览

以下是完整的高层次流程: