
JWT(JSON Webトークン)とホセ(JSONオブジェクトの署名と暗号化)仕様スイートのDelphi実装。このライブラリは、いくつかのホセアルゴリズムを使用して、JWS(JWEサポートが計画されている)コンパクトなシリアル化をサポートしています。

Delphi 10シアトルの前に、HMAC-SHAアルゴリズムはIndyライブラリを介してOpenSSLを使用しているため、トークンを生成するには、サーバーシステムにOpenSSL DLLが必要です。
Delphi 10シアトルまたは新しいDelphiバージョンでは、HMACアルゴリズムもSystem.hashユニットにあるため、OpenSSLは必要ありません。
HMAC-RSA(ECDSA)アルゴリズムは必然的にOpenSSLを使用するため、これらのアルゴリズムを使用してトークンに署名する場合は、OpenSSLをダウンロードして展開する必要があります(サーバー上)。
クライアントは(SHAまたはRSAを使用)トークンを生成または検証する必要がないため、クライアント側にOpenSSL DLLが不要になることに注意してください。
サーバー上のOpenSSLライブラリが必要な場合は、インディのGitHubプロジェクトページにパッケージを直接ダウンロードできます(常に最新バージョンに更新し、アプリケーションのビットネスに合わせてください)
ホセは、コンテンツの署名と暗号化に対する一般的なアプローチを提供する標準です。ホセはいくつかのRFCで構成されています:
| アルゴリズム | サポート |
|---|---|
exp | ✔✔️ |
iat | ✔✔️ |
nbf | ✔✔️ |
aud | ✔✔️ |
iss | ✔✔️ |
jti | ✔✔️ |
typ | ✔✔️ |
TJOSEProducerおよびTJOSEProducerBuilder (エイリアスTJOSEProcess )クラスは、多くのオプションを備えた新しいコンパクトトークンを構築しますTJOSEConsumerおよびTJOSEConsumerBuilderクラスは、細かい粒度でトークンを検証する| アルゴリズム | サポート |
|---|---|
None | ✔️使用しないでください! ? |
HS256 | ✔✔️ |
HS384 | ✔✔️ |
HS512 | ✔✔️ |
RS256 | ✔§更新されました! |
RS384 | ✔§更新されました! |
RS512 | ✔§更新されました! |
ES256 | ✔§新規! ? |
ES384 | ✔§新規! ? |
ES512 | ✔§新規! ? |
ES256K | ✔§新規! ? |
None Algorithmの脆弱性の影響を受けませんこのライブラリは、 Delphi 12 Athens 、 Delphi 11 Alexandria 、 Delphi 10.4シドニー、 Delphi 10.3 Rio 、 Delphi 10.2 Tokyoでテストされていますが、 DXE6以上でコンパイルまたはテストを試みたりテストしたりしていません。
このライブラリには、外部ライブラリ/ユニットに依存関係がありません。
デルファイユニット使用:
ソースパス「ソース/コモン」とソース/ホセをデルファイプロジェクトパスに追加するだけで、行ってみてください!
boss installコマンドの使用:
$ boss install github.com/paolo-rossi/delphi-jose-jwtトークンを作成するには、 TJWTクラスのインスタンスを作成してプロパティを設定するだけです(クレーム)。
JWTトークン(コンパクトな表現)を構築する最も簡単な方法は、 IJOSEProducerインターフェイスを使用することです。
uses
JOSE.Producer;
var
LResult: string;
begin
LResult := TJOSEProcess.New
.SetIssuer( ' Delphi JOSE Library ' )
.SetIssuedAt(Now)
.SetExpiration(Now + 1 )
.SetAlgorithm(LAlg)
.SetKey(TJOSEAlgorithmId.HS256)
.Build
.GetCompactToken
;
memoCompact.Lines.Add(LResult);
end ;トークンのシリアル化、脱派、確認の別の方法は、 TJOSEユーティリティクラスを使用することです。
uses
JOSE.Core.JWT,
JOSE.Core.Builder;
var
LToken: TJWT;
LCompactToken: string;
begin
LToken := TJWT.Create;
try
// Token claims
LToken.Claims.Issuer := ' WiRL REST Library ' ;
LToken.Claims.Subject := ' Paolo Rossi ' ;
LToken.Claims.Expiration := Now + 1 ;
// Signing and Compact format creation
LCompactToken := TJOSE.SHA256CompactToken( ' my_very_long_and_safe_secret_key ' , LToken);
mmoCompact.Lines.Add(LCompactToken);
finally
LToken.Free;
end ;TJWT 、 TJWS 、およびTJWKクラスを使用して、最終的なコンパクトトークンの作成をより制御できます。
var
LToken: TJWT;
LSigner: TJWS;
LKey: TJWK;
LAlg: TJOSEAlgorithmId;
begin
LToken := TJWT.Create;
try
// Set your claims
LToken.Claims.Subject := ' Paolo Rossi ' ;
LToken.Claims.Issuer := ' Delphi JOSE Library ' ;
LToken.Claims.IssuedAt := Now;
LToken.Claims.Expiration := Now + 1 ;
// Choose the signing algorithm
case cbbAlgorithm.ItemIndex of
0 : LAlg := TJOSEAlgorithmId.HS256;
1 : LAlg := TJOSEAlgorithmId.HS384;
2 : LAlg := TJOSEAlgorithmId.HS512;
else LAlg := TJOSEAlgorithmId.HS256;
end ;
// Create your key from any text or TBytes
LKey := TJWK.Create(edtSecret.Text);
try
// Create the signer
LSigner := TJWS.Create(LToken);
try
// With this option you can have keys < algorithm length
LSigner.SkipKeyValidation := True;
// Sign the token!
LSigner.Sign(LKey, LAlg);
memoCompact.Lines.Add( ' Header: ' + LSigner.Header);
memoCompact.Lines.Add( ' Payload: ' + LSigner.Payload);
memoCompact.Lines.Add( ' Signature: ' + LSigner.Signature);
memoCompact.Lines.Add( ' Compact Token: ' + LSigner.CompactToken);
finally
LSigner.Free;
end ;
finally
LKey.Free;
end ;
finally
LToken.Free;
end ;
トークンの開梱と検証は簡単です。
キーとトークンコンパクト形式をTJOSE.Verifyクラス関数に渡す必要があります
var
LKey: TJWK;
LToken: TJWT;
begin
// Create the key from a text or TBytes
LKey := TJWK.Create( ' my_very_long_and_safe_secret_key ' );
// Unpack and verify the token!
LToken := TJOSE.Verify(LKey, FCompactToken);
if Assigned(LToken) then
begin
try
if LToken.Verified then
mmoJSON.Lines.Add( ' Token signature is verified ' )
else
mmoJSON.Lines.Add( ' Token signature is not verified ' )
finally
LToken.Free;
end ;
end ;
end ;新しいクラスのTJOSEConsumerを使用すると、トークンの主張を検証するのは非常に簡単です。 TJOSEConsumerオブジェクトは、Fluentインターフェイスを使用してTJOSEConsumerBuilderユーティリティクラスで構築されています。
var
LConsumer: IJOSEConsumer;
begin
LConsumer := TJOSEConsumerBuilder.NewConsumer
.SetClaimsClass(TJWTClaims)
// JWS-related validation
.SetVerificationKey(edtConsumerSecret.Text)
.SetSkipVerificationKeyValidation
.SetDisableRequireSignature
// string-based claims validation
.SetExpectedSubject( ' paolo-rossi ' )
.SetExpectedAudience(True, [ ' Paolo ' ])
// Time-related claims validation
.SetRequireIssuedAt
.SetRequireExpirationTime
.SetEvaluationTime(IncSecond(FNow, 26 ))
.SetAllowedClockSkew( 20 , TJOSETimeUnit.Seconds)
.SetMaxFutureValidity( 20 , TJOSETimeUnit.Minutes)
// Build the consumer object
.Build();
try
// Process the token with your rules!
LConsumer.Process(Compact);
except
// (optionally) log the errors
on E: Exception do
memoLog.Lines.Add(E.Message);
end ;