TsgcHTTP_JWT_Client

配置使用 JWT 客户端时将使用的 openSSL 库。

简介

TsgcHTTP_JWT_Client 组件允许您对 JWT 令牌进行编码和签名,并将其附加到 WebSocket 客户端HTTP/2 客户端,令牌将自动作为 Authorization Bearer Token 请求头发送。

配置

您可以在 JWTOptions 属性中配置 JWT 值,其中有两个主要属性:HeaderPayload,只需为每个必填属性设置相应的值即可。

 

若签名使用私钥(RS 和 ES 算法)加密,请在算法的 PrivateKey 属性中设置相应值。

如果签名使用密钥(HS 算法)加密,请在 算法的 Secret 属性中设置该值。

 

OpenSSL 选项

配置使用 JWT 客户端时将使用的 openSSL 库。

 

OpenSSL_Options:OpenSSL 库的配置。

APIVersion:允许定义将使用哪个 OpenSSL API 版本。

oslAPI_1_0: 使用 API 1.0 OpenSSL,这是 Indy 支持的最新版本

oslAPI_1_1:使用 API 1.1 OpenSSL,需要我们的自定义 Indy 库,允许使用支持 TLS 1.3 的 OpenSSL 1.1.1 库。

oslAPI_3_0:使用 API 3.0 OpenSSL,需要我们的自定义 Indy 库,允许使用支持 TLS 1.3 的 OpenSSL 3.0.0 库。

LibPath: 在此处您可以配置 openSSL 库的位置

oslpNone:这是默认值,OpenSSL 库应与二进制文件位于同一文件夹中,或位于已知路径中。

oslpDefaultFolder:自动设置所有 IDE 版本应查找 OpenSSL 库的路径。

oslpCustomFolder: 如果选择此选项,请在属性 LibPathCustom 中定义完整路径。

LibPathCustom:当 LibPath = oslpCustomFolder 时,在此处定义 openSSL 库所在的完整路径。

UnixSymLinks: 启用或禁用在 Unix 系统下加载符号链接(默认启用,OSX64 除外):

oslsSymLinksDefault: 默认情况下启用,但在 OSX64 下除外(MacOS Monterey 之后,不带版本号尝试加载库会失败)。

oslsSymLinksLoadFirst:先加载符号链接,然后再尝试加载版本库。

oslsSymLinksLoad: 在尝试加载版本库后加载符号链接。

oslsSymLinksDontLoad:不加载符号链接。

 

自定义标头

Header 和 Payload 属性包含生成 JWT 常用的标头,但您也可以通过调用 AddKeyValue 方法并传入键和值作为参数来添加更多标头。

示例:如果您想在 JWT 头部添加带有您姓名的新记录,请使用以下方法:

 


    Header.AddKeyValue('name', 'John Smith');

 

配置属性后,要生成 JWT,只需调用方法 Sign,它将返回 JWT 的值。

 

WebSocket 客户端与 JWT

TsgcWebSocketClient 支持在连接 WebSocket 服务器时使用 JWT,只需创建一个新的 JWT 客户端并将其赋值给 Authentication.Token.JWT 属性即可。

 


    oClient := TsgcWebSocketClient.Create(nil);
    oClient.URL := 'ws://www.esegece.com:2052';
    
oJWT := TsgcHTTP_JWT_Client.Create(nil); oJWT.JWTOptions.Header.alg := jwtRS256; oJWT.JWTOptions.Payload.sub := '1234567890'; oJWT.JWTOptions.Payload.iat := 1516239022;
oClient.Authentication.Enabled := True; oClient.Authentication.URL.Enabled := False; oClient.Authentication.Token.Enabled := True; oClient.Authentication.Token.JWT := oJWT; oClient.Active := True;

 

HTTP 客户端和 JWT

TsgcHTTP2ClientTsgcHTTP1Client 允许在连接到 HTTP/2 服务器时使用 JWT,只需创建一个新的 JWT 客户端并分配给 Authentication.Token.JWT属性即可。

 


    oHTTP := TsgcHTTP2Client.Create(nil);
    
oJWT := TsgcHTTP_JWT_Client.Create(nil); oJWT.JWTOptions.Header.alg := jwtRS256; oJWT.JWTOptions.Payload.sub := '1234567890'; oJWT.JWTOptions.Payload.iat := 1516239022;
oHTTP.Authentication.Token.JWT := oHTTP; oHTTP.Get('https://your.api.com');

 

过期时间

授权令牌可以在每次发送 HTTP 请求时重新创建,也可以多次复用直至过期

示例:使用令牌调用 Apple APNs,要求令牌至少重用 20 分钟,最多 1 小时。使用属性 RefreshTokenAfter 设置令牌过期的秒数,例如 30 分钟后。


    RefreshTokenAfter = 60 * 40.

 

创建 JWT 签名

您可以手动创建 JWT 签名,用于不使用 WebSocket 或 HTTP 协议的应用程序,或者如果您使用第三方应用程序的组件而只需要 JWT 令牌。

 

要获取 JWT 签名,只需创建 JWT 客户端的新实例并手动填写属性。当所有属性设置完毕后,调用方法 Sign,它将返回 JWT 令牌。

 


    oJWT := TsgcHTTP_JWT_Client.Create(nil);
    // ... header
    oJWT.JWTOptions.Header.alg := jwtHS256;
    oJWT.JWTOptions.Algorithms.HS.Secret := '79F66F1E-E998-436B-8A0A-3E5DEFA4FD9E';
    // ... payload
    oJWT.JWTOptions.Payload.jti := '9B66FB94-B761-42B1-A1AF-3C44233DBE87';
    oJWT.JWTOptions.Payload.iat := 1630925658;
    oJWT.JWTOptions.Payload.iss := '2886EC7547B7BA6A9009';
    oJWT.JWTOptions.Payload.exp := 1630933158;
    // ... custom payload values
    oJWT.JWTOptions.Payload.ClearKeyValues;
    oJWT.JWTOptions.Payload.AddKeyValue('origin', 'www.yourwebsite.com');
    oJWT.JWTOptions.Payload.AddKeyValue('ip', '69.39.46.178');
    // ... get JWT Token
    ShowMessage(oJWT.Sign);

 

参考