独立产品 OAuth2、JWT 与 WebAuthn

sgcAuth:面向 Delphi 和 C++ Builder 的 OAuth2、JWT 与 WebAuthn 组件

两个客户端组件,把现代身份验证中令牌相关的部分带入您的应用程序。TsgcHTTP_OAuth2_Client 面向任意 OAuth2/OIDC 提供商,实现 Authorization Code、PKCE、Client Credentials、Resource Owner Password 和 Device Code 五种授权模式。TsgcHTTP_JWT_Client 用于构建、签名和验证 JSON Web Token,既可以独立使用,也可以作为您的 WebSocket 和 HTTP 客户端的 Bearer 令牌来源。另外五个组件分别带来 TOTP 第二身份因素、LDAP 与 Active Directory 登录、SAML 单点登录、OpenID Connect 和邮件 OAuth2。sgcAuth 是独立产品,内置两个客户端所基于的 sgcWebSockets Core 运行时。

完整源代码
Delphi 7 到 13 和 C++ Builder
内置运行时 sgcWebSockets Core 两个客户端底层共用的 HTTP、TLS 和 JSON 运行时
OAuth2 TsgcHTTP_OAuth2_Client
JWT TsgcHTTP_JWT_Client

两分钟了解 sgcAuth

在 Delphi 和 C++Builder 中实现 OAuth2、JWT 和 WebAuthn passkey,客户端与自建服务器均可使用。

7 组件 组件面板上的一个页面
9 已实现的 RFC OAuth2、PKCE、DPoP、Device Code、JWT/JWS/JWE 等
5 支持平台 Windows、macOS、Linux、iOS 和 Android
100% 包含源代码 两个客户端及内置的 Core 运行时
12 个月更新 授权有效期内发布的每个版本

三件值得先了解的事

sgcAuth 需要您准备什么、您是否已经拥有这些组件,以及 WebAuthn 还需要什么。三个答案都很简短。

sgcAuth 是自包含的

作为独立产品,已包含 sgcWebSockets Core 运行时:两个组件用于 POST 令牌请求的 HTTP/TLS 客户端栈,以及解析响应的 JSON 机制。一个 SKU,一个安装程序。

每份授权都附带完整源代码,因此两个客户端及其底层运行时都可以在您自己的调试器中单步跟踪,而不会消失在二进制文件里。

版本重叠

您的 sgcWebSockets 版本中是否已经包含?

OAuth2 客户端和 JWT 客户端均自 Standard 版本起随 sgcWebSockets 提供,因此只要您拥有任意版本的 sgcWebSockets,就已经拥有这两个组件。WebAuthn、TOTP、LDAP、SAML、OpenID Connect 和 Mail OAuth2 组件则随 Enterprise 版本提供。All-Access 包含全部内容。

sgcAuth 面向相反的情形:您希望在 Delphi 或 C++ Builder 中使用 OAuth2 和 JWT 客户端,但不想购买完整的 sgcWebSockets 版本。购买前请先确认您的版本已经覆盖了哪些内容。

需要附加包

WebAuthn 需要 sgcCustomIndy

WebAuthn 通行密钥与无密码登录由 TsgcWSAPIServer_WebAuthn 提供,这是一个 sgcWebSockets Enterprise/All-Access 组件,构建在 sgcCustomIndy 所提供的经过修补的 Indy 库之上。WebAuthn 需要 sgcCustomIndy 附加包,订购 sgcAuth 时会自动添加。TOTP、LDAP、SAML、OpenID Connect 和 Mail OAuth2 组件由同一个附加包解锁。

已经拥有 sgcCustomIndy 授权?可以在结账前从购物车中移除自动添加的这一项,两种方式都不会产生额外费用。

令牌客户端、第二身份因素与单点登录

每一个都是非可视化组件,可以拖放到窗体上,也可以在代码中创建,声明在 sgc 前缀单元中,并注册在 SGC Auth 面板页上。设置提供商信息,接好事件,然后调用 Start。TOTP、LDAP、SAML、OpenID Connect 和 Mail OAuth2 组件与 WebAuthn 一样,随 sgcCustomIndy 一起解锁。

OAuth21 个组件

五种授权模式,一个组件

TsgcHTTP_OAuth2_Client 通过 OAuth2Options.GrantType 驱动多种授权模式:面向可信服务端应用的 auth2Code,面向原生、移动端和单页应用的 auth2CodePKCE,面向守护进程和服务账号的 auth2ClientCredentials,以及 auth2ResourceOwnerPassword,还有面向智能电视、自助终端等输入受限设备的 auth2DeviceCode(RFC 8628)。将 AuthorizationServerOptions 指向提供商的授权、令牌、吊销和自省端点,其余交给组件处理:当 Active/Start 运行 Authorization Code 流程时,它会打开系统浏览器,并通过 LocalServerOptions 启动一个小型本地 HTTP 服务器来捕获重定向,再通过 HTTPClientOptions 以纯 HTTPS 方式用授权码换取令牌。此后 Refresh、Revoke 和 Introspect 覆盖令牌的后续生命周期,DPoPOptions 配合 GenerateDPoPKeyPair 为要求 DPoP 持有证明(RFC 9449)的提供商提供支持。现成的 Google 和 Microsoft 预设会为您配置好常用的端点和范围。

TsgcHTTP_OAuth2_Client RFC 6749 · PKCE · Device Code · DPoP
JWT1 个组件

签名、附加或验证,由您选择

TsgcHTTP_JWT_Client 通过 JWTOptions 提供 RFC 7519 所需的一切:JOSE Header(alg、typ、kid),已注册的 Payload 声明(iss、sub、aud、exp、nbf、iat、jti,另可通过 AddKeyValue 添加自定义声明),以及 Algorithms 下用于 HMAC(HS.Secret)、RSA(RS.PrivateKey)和 ECDSA(ES.PrivateKey)的密钥材料。调用 Sign 可直接得到紧凑序列化格式的令牌,适合没有内置 HTTP 或 WebSocket 客户端的服务;也可以设置 RefreshTokenAfter,让组件自动刷新 iat/exp 并重新签名。同一个组件可直接接入 TsgcWebSocketClient、TsgcHTTP1Client 和 TsgcHTTP2Client 的 Authentication.Token.JWT,这样每个出站请求都会携带最新的 Bearer 令牌,而无需您自己处理请求头。

TsgcHTTP_JWT_Client RFC 7519 · JWS · JWE
TOTP1 个组件

每个验证码只被接受一次

TsgcTOTPAuthenticator 为您的登录流程加入任意身份验证器应用生成的六位验证码,包括 Google Authenticator 和 Microsoft Authenticator。GenerateSecret 创建一个随机的 Base32 密钥,GetProvisioningURI 构建在开通阶段渲染为二维码的 otpauth:// URI。VerifyCode 会以可配置的 Window 检查用户输入的验证码以容忍时钟偏移,其带防重放保护的重载版本永远不会两次接受同一个时间步长的验证码。GenerateHOTP 和 VerifyHOTP 覆盖基于计数器的硬件令牌,GenerateRecoveryCodes 生成一组一次性后备恢复码,Algorithm、Digits 和 Period 可选择 HMAC-SHA1、HMAC-SHA256 或 HMAC-SHA512,验证码位数可设为 6 到 8 位。

TsgcTOTPAuthenticator RFC 6238 · RFC 4226 · otpauth QR
LDAP1 个组件

通过 TLS 实现 Active Directory 登录

TsgcLDAPClient 是一个 LDAP v3 客户端,用于对照 Active Directory 或任意其他 LDAP 目录检查用户名和密码。Security 可选择端口 636 上的 LDAPS,或端口 389 上的 StartTLS,被拒绝的 StartTLS 会直接关闭连接,而不会回退为明文。AuthenticationMode 将用户输入的内容转换为绑定名,可以是 UPN、DOMAIN\user 形式的用户名、完整 DN,或服务绑定加 UserSearchFilter 搜索,Authenticate 可一次调用完成整个检查过程。GetUserGroups 通过 LDAP_MATCHING_RULE_IN_CHAIN 返回直接或嵌套的组成员关系,Search 会自动对大结果集分页,并且每个公共方法都经过串行化,因此单个实例即可为多线程服务器提供服务。

TsgcLDAPClient RFC 4511 · LDAPS · StartTLS
SAML1 个组件

为您的 Web 应用提供企业级单点登录

TsgcSAMLServiceProvider 让您的 Delphi Web 应用成为面向 Microsoft Entra ID、Okta、AD FS、Google Workspace、Keycloak 及其他身份提供者的 SAML 2.0 服务提供者。GetMetadata 生成需在 IdP 中注册的元数据,LoadIdPMetadata 读取 IdP 的元数据。GetAuthnRequestRedirectURL 和 GetAuthnRequestPostForm 通过 Redirect 或 POST 绑定将浏览器送去登录,ProcessResponse 校验返回的内容:仅对照受信的 IdPCertificates 验证签名,要求恰好一个断言以挫败签名包装攻击,随后校验颁发者、受众、目的地、InResponseTo、有效期窗口,并维护防重放缓存。结果以带有 NameID、会话索引和属性的 TsgcSAMLResult 形式返回。

TsgcSAMLServiceProvider SAML 2.0 · HTTP-Redirect · HTTP-POST
OpenID Connect1 个组件

使用任意 OpenID 提供者登录

TsgcHTTP_OIDC_Client 在 OAuth2 客户端基础上扩展了 OpenID Connect。设置 OIDCOptions.Issuer,Discover 会从提供者配置中填充端点和 JWKSURI。Start 以 PKCE 和新生成的 nonce 运行浏览器登录,随后验证 ID 令牌的签名、颁发者、受众、过期时间和 nonce,仅接受 RS256、RS384、RS512、ES256 和 ES384,绝不接受 none 或 HS 系列算法。OnOIDCIDToken 传递声明,GetUserInfo 返回用户资料,线程安全的密钥缓存会自动跟随密钥轮换而无需重启。在服务器端,sgcOIDC_ValidateIDToken 使用同一个缓存校验您的 REST API 或 WebSocket 服务器收到的 Bearer 令牌。

TsgcHTTP_OIDC_Client OpenID Connect Core 1.0 · Discovery · PKCE
Mail OAuth21 个组件

面向 SMTP、IMAP 和 POP3 的现代身份验证

TsgcMailOAuth2 获取 Microsoft 365 和 Gmail 邮件所需的令牌。选择 Provider(mopMicrosoft365、mopGmail 或 mopCustom)以及所使用的 Protocols,组件会请求匹配的作用域。Flow 可选择以 PKCE 和回环重定向运行浏览器登录,也可选择面向服务和控制台程序的设备代码流程。Refresh 刷新访问令牌,每次都会触发 OnTokensChanged,方便您存储新的刷新令牌。GetXOAuth2 和 GetOAuthBearer 返回用于 AUTH XOAUTH2 和 AUTH OAUTHBEARER 的 SASL 字符串,可直接用于 Indy 的 TIdSMTP、TIdIMAP4、TIdPOP3 或任何其他邮件库。

TsgcMailOAuth2 RFC 7628 · XOAUTH2 · Microsoft 365 · Gmail

从 Delphi 代码实现身份验证流程

两个组件都是普通的非可视化组件,因此可以嵌入到您现有的任何应用程序中:VCL 桌面应用、Windows 服务、Linux 守护进程。以下是客户常用的模式,每一种都对应驱动它的属性或方法。

使用 Google 或 Microsoft 登录 auth2CodePKCE

现成的 Google 和 Microsoft 预设会为您配置好授权和令牌端点及范围。

服务器到服务器的 API 访问 auth2ClientCredentials

后台任务和服务账号无需用户参与即可对 API 进行身份验证。

智能电视、自助终端和物联网设备 auth2DeviceCode

设备显示一个简短的代码,用户在手机或笔记本电脑上完成登录。

长会话,无需重新提示登录 Refresh

在后台用刷新令牌换取新的访问令牌,无需再次跳转浏览器。

为您自己的 WebSocket 和 HTTP API 提供身份验证 Authentication.Token.JWT

JWT 客户端会自动为 TsgcWebSocketClient、TsgcHTTP1Client 和 TsgcHTTP2Client 签发 Bearer 令牌。

独立签发令牌 Sign

为任意代码库构建并签名一个 JWT 字符串,无需 WebSocket 或 HTTP 组件。

一次浏览器跳转、一次签名,加一个内置运行时

OAuth2 和 JWT 解决的是不同的问题:一个是与远程服务器协商令牌,另一个是在本地签名令牌,而这正是把它们打包在一起的意义所在:sgcAuth 用同一套组件约定把这种差异隐藏起来,底层的管道工作交给内置的 sgcWebSockets Core 运行时完成。

OAuth2 先是浏览器跳转,然后是纯 HTTPS

Start 会打开系统浏览器(对于 Device Code 流程,则是把用户代码交给您显示),并由 LocalServerOptions 启动的本地 HTTP 监听器捕获授权重定向。换取访问令牌是通过 HTTPClientOptions、在 Core 运行时的 HTTP 客户端栈上发出的一次纯 HTTPS POST 请求。

JWT 是签名,不是网络通信

TsgcHTTP_JWT_Client 从不打开套接字。JWTOptions 配置头部、载荷和密钥材料,Sign 返回紧凑序列化格式的令牌(HMAC、RSA 或 ECDSA),可直接附加到您自己代码发出的任意请求上。

内置 Core 运行时

作为独立产品,已包含 sgcWebSockets Core 运行时。它提供两个组件用于 POST 请求的 HTTP/TLS 客户端栈,以及读取响应的 JSON 解析器,其完整源代码也和其他一切一样,是本产品包的一部分。

WebAuthn 是第三块拼图,经由 sgcCustomIndy

无密码登录由 TsgcWSAPIServer_WebAuthn 处理,这是一个 sgcWebSockets Enterprise/All-Access 服务端组件,需要 sgcCustomIndy 提供的经过修补的 Indy 编译版本。订购 sgcAuth 时会自动将 sgcCustomIndy 添加到您的购物车。

获取一个令牌,签发一个令牌

两个组件遵循同样的形态:配置选项,然后调用方法。它们都可以在 Delphi 7 到 13 以及 C++ Builder 中编译,.NET 也提供相同的属性。

uses
  sgcHTTP, sgcHTTP_OAuth_Types, sgcHTTP_JWT_Types;

var
  OAuth2: TsgcHTTP_OAuth2_Client;
  JWT: TsgcHTTP_JWT_Client;
begin
  // OAuth2: Authorization Code Grant with PKCE
  OAuth2 := TsgcHTTP_OAuth2_Client.Create(nil);
  OAuth2.OAuth2Options.GrantType := auth2CodePKCE;
  OAuth2.OAuth2Options.ClientId := 'your-client-id';
  OAuth2.AuthorizationServerOptions.AuthURL := 'https://provider.com/oauth2/authorize';
  OAuth2.AuthorizationServerOptions.TokenURL := 'https://provider.com/oauth2/token';
  OAuth2.AuthorizationServerOptions.Scope.Clear;
  OAuth2.AuthorizationServerOptions.Scope.Add('openid');
  OAuth2.AuthorizationServerOptions.Scope.Add('profile');
  OAuth2.LocalServerOptions.IP := '127.0.0.1';
  OAuth2.LocalServerOptions.Port := 8080;
  OAuth2.OnAfterAccessToken := OAuth2AccessToken;
  OAuth2.Start;   // opens the browser; the redirect lands on the local server

  // JWT: sign a token for your own API
  JWT := TsgcHTTP_JWT_Client.Create(nil);
  JWT.JWTOptions.Header.alg := jwtHS256;
  JWT.JWTOptions.Algorithms.HS.Secret := '79F66F1E-E998-436B-8A0A-3E5DEFA4FD9E';
  JWT.JWTOptions.Payload.iss := 'your-service';
  JWT.JWTOptions.Payload.sub := '1234567890';
  JWT.JWTOptions.Payload.iat := DateTimeToUnix(Now);
  ShowMessage(JWT.Sign);
end;

procedure TForm1.OAuth2AccessToken(Sender: TObject; const Access_Token,
  Token_Type, Expires_In, Refresh_Token, Scope, RawParams: String;
  var Handled: Boolean);
begin
  Memo1.Lines.Add('Access token received.');
end;

同一个 JWT 组件也可以直接接入 WebSocket 或 HTTP 客户端:设置 Client.Authentication.Token.Enabled := True 和 Client.Authentication.Token.JWT := JWT,之后每个请求都会携带最新的 Bearer 令牌。

// include: sgcHTTP.hpp, sgcHTTP_OAuth_Types.hpp, sgcHTTP_JWT_Types.hpp

// OAuth2: Authorization Code Grant with PKCE
TsgcHTTP_OAuth2_Client *OAuth2 = new TsgcHTTP_OAuth2_Client(this);
OAuth2->OAuth2Options->GrantType = auth2CodePKCE;
OAuth2->OAuth2Options->ClientId = "your-client-id";
OAuth2->AuthorizationServerOptions->AuthURL = "https://provider.com/oauth2/authorize";
OAuth2->AuthorizationServerOptions->TokenURL = "https://provider.com/oauth2/token";
OAuth2->AuthorizationServerOptions->Scope->Clear();
OAuth2->AuthorizationServerOptions->Scope->Add("openid");
OAuth2->AuthorizationServerOptions->Scope->Add("profile");
OAuth2->LocalServerOptions->IP = "127.0.0.1";
OAuth2->LocalServerOptions->Port = 8080;
OAuth2->OnAfterAccessToken = OAuth2AccessToken;
OAuth2->Start();   // opens the browser; the redirect lands on the local server

// JWT: sign a token for your own API
TsgcHTTP_JWT_Client *JWT = new TsgcHTTP_JWT_Client(this);
JWT->JWTOptions->Header->alg = jwtHS256;
JWT->JWTOptions->Algorithms->HS->Secret = "79F66F1E-E998-436B-8A0A-3E5DEFA4FD9E";
JWT->JWTOptions->Payload->iss = "your-service";
JWT->JWTOptions->Payload->sub = "1234567890";
JWT->JWTOptions->Payload->iat = DateTimeToUnix(Now());
ShowMessage(JWT->Sign());

void __fastcall TForm1::OAuth2AccessToken(TObject *Sender,
  const UnicodeString Access_Token, const UnicodeString Token_Type,
  const UnicodeString Expires_In, const UnicodeString Refresh_Token,
  const UnicodeString Scope, const UnicodeString RawParams, bool &Handled)
{
  Memo1->Lines->Add("Access token received.");
}

同一个 JWT 组件也可以直接接入 WebSocket 或 HTTP 客户端:设置 Client->Authentication->Token->Enabled = true 和 Client->Authentication->Token->JWT = JWT,之后每个请求都会携带最新的 Bearer 令牌。

纯 HTTPS 与签名,无需原生库

两个组件都只依赖 Core 运行时的 HTTP 客户端栈和平台的加密原语,因此可以在 Delphi 支持的任何平台上编译和运行。

TsgcHTTP_OAuth2_Client Authorization Code, PKCE, Client Credentials, Resource Owner Password, Device Code
Windows Win32 Windows Win64 Linux64 macOS iOS Android
TsgcHTTP_JWT_Client HS256/384/512, RS256/384/512, ES256/384/512, ML-DSA-44/65/87
Windows Win32 Windows Win64 Linux64 macOS iOS Android
IDE 支持 一份源码树,每个版本各有设计期包
Delphi 7 到 13 C++ Builder
试用安装程序 sgcWebSockets All-Access 试用版包含 Auth 组件
一次下载,两个组件

下载试用安装程序 →

一个独立的包

sgcAuth 单独授权,单个开发者起价 €149。所有授权均包含完整源代码、1 年更新,以及 50% 到 70% 的续订折扣:续订 1 个包为 50%,2 个包为 60%,3 个及以上为 70%。sgcAI、sgcMQ、sgcSocial、sgcCustomIndy、sgcAuth、sgcHTTP 和 sgcREST 各算作一个包。

sgcAuth

€149

提供 Single、Team 和 Site 授权。

  • OAuth2 客户端:Authorization Code、PKCE、Client Credentials、Device Code
  • JWT 客户端,用于签发、签名和验证令牌
  • WebAuthn 通行密钥,经由 sgcCustomIndy(自动添加)
  • TOTP、LDAP、SAML、OpenID Connect 和 Mail OAuth2,经由 sgcCustomIndy
  • 已包含 sgcWebSockets Core 运行时
  • Delphi 7 到 13 和 C++ Builder
  • 完整源代码
  • 1 年更新

sgcAuth 已包含 sgcWebSockets Core 运行时,因此使用 OAuth2 和 JWT 客户端无需再购买其他任何东西。

结算页面会列出两项:计价为零的 sgcWebSockets Core 运行时授权,以及 sgcAuth 包本身。sgcCustomIndy 会为 WebAuthn 自动添加,如果您已经拥有授权,可以将其移除。查看完整价格详情。

3,000+开发者
20+年
761+组件
30+API 集成
5平台
30 天退款保证不满意?可在购买后 30 天内申请全额退款。 查看退款政策

交付完整的身份验证,而不只是一个令牌库

在原生 Delphi 和 C++ Builder 代码中使用 OAuth2 和 JWT,内置运行时,并提供完整源代码。立即下载 All-Access 试用安装程序,把两个组件拖到窗体上试试。

eSeGeCe 的其他产品

把 sgcAuth 与我们其他的 Delphi、C++ Builder 和 .NET 组件库搭配使用。

sgcWebSockets

完整的库:WebSocket 客户端和服务器、HTTP/2、IoT、P2P 和 AI 组件。它的各个版本也包含 OAuth2 和 JWT 客户端。

了解更多 →

sgcCustomIndy

sgcWebSockets Enterprise 所基于的定制 Indy 库,以附加包形式提供。WebAuthn 需要它,订购 sgcAuth 时会自动添加。

了解更多 →

sgcAI

AI、LLM 与 MCP 组件。一个聊天组件即可接入 OpenAI、Anthropic、Gemini、DeepSeek、Ollama、Grok 和 Mistral。

了解更多 →

sgcMQ

原生 MQTT 3.1.1/5.0、AMQP 0.9.1、AMQP 1.0、Apache Kafka 和 STOMP 客户端组件,已内置 Core 运行时。

了解更多 →

sgcSocial

WhatsApp Business Cloud API 和 Telegram TDLib 客户端组件,已内置 Core 运行时。

了解更多 →

sgcHTML

面向 Delphi、C++ Builder 和 .NET 的数据感知服务器端 HTML/UI 组件,配套 Bootstrap 5 和 htmx,其中包含一个 WebAuthn 登录 UI 组件。

了解更多 →

sgcWebRTC

完整的 WebRTC 媒体引擎:音视频通话、数据通道和屏幕共享。sgcWebSockets Enterprise 的附加组件。

了解更多 →

sgcCrypto

对称与非对称加密算法、哈希和后量子算法。自 sgcWebSockets Standard 起免费提供。

了解更多 →