
Delphi تطبيق JWT (JSON Web Token) وجناح مواصفات JOSE (توقيع كائن JSON وتشفيره). تدعم هذه المكتبة أن JWS (دعم JWE) التسلسل المدمج مع العديد من خوارزميات خوسيه.

قبل Delphi 10 Seattle ، تستخدم خوارزمية HMAC-sha openssl من خلال مكتبة Indy ، لذلك من أجل إنشاء الرمز المميز ، يجب أن يكون لديك DLLs OpenSSL في نظام الخادم الخاص بك.
في إصدارات Delphi 10 Seattle أو أحدث إصدارات Delphi ، توجد خوارزمية HMAC أيضًا في System.Hash Unit بحيث لا تكون هناك حاجة إلى OpenSSL.
تستخدم خوارزمية HMAC-RSA (ECDSA) بالضرورة OpenSSL ، لذا إذا كنت تخطط لاستخدام هذه الخوارزميات لتوقيع الرمز المميز الذي يجب عليك تنزيله ونشر OpenSL (على الخادم).
يرجى مراعاة أن العميل لا يتعين على توليد الرمز المميز (باستخدام SHA أو RSA) ، لذا لا توجد حاجة إلى DLLs OpenSSL.
إذا كنت بحاجة إلى مكتبة OpenSSL على الخادم ، فيمكنك تنزيل الحزمة مباشرةً على صفحة مشروع GitHub INDY (ضع في اعتبارك دائمًا التحديث إلى أحدث إصدار ولتطابق مع عمرك في التطبيق)
خوسيه هو معيار يوفر نهجا عاما لتوقيع وشراء أي محتوى. يتكون خوسيه من عدة 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تم اختبار هذه المكتبة مع Delphi 12 Athens ، Delphi 11 Alexandria ، Delphi 10.4 Sydney ، Delphi 10.3 Rio ، Delphi 10.2 Tokyo ، لكن مع بعض الأعمال ، يجب أن تجمعها مع DXE6 وأعلى ، لكنني لم أحاول أو اختبرت ذلك ، إذا نجحت في هذه المهمة ، سأكون سعيدًا بإنشاء فرع من عملك!
لا تحتوي هذه المكتبة على تبعيات على المكتبات/الوحدات الخارجية.
وحدات دلفي المستخدمة:
ما عليك سوى إضافة مسار المصدر "Source/Common" و Source/Jose "إلى مسار مشروع Delphi الخاص بك و .. أنت على ما يرام!
باستخدام أمر 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 مع فئة الأداة المساعدة 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 ;