
การใช้งาน Delphi ของ JWT (Token JSON Web) และชุดข้อมูลจำเพาะ Jose (JSON Signing and Encryption) ห้องสมุดนี้รองรับ jws (การสนับสนุน JWE ได้รับการวางแผน) serializations ขนาดกะทัดรัดด้วยอัลกอริทึม Jose หลายตัว

ก่อนที่จะ Delphi 10 Seattle อัลกอริทึม HMAC-Sha ใช้ OpenSSL ผ่านไลบรารี Indy ดังนั้นเพื่อสร้างโทเค็นคุณควรมี OpenSSL DLLs ในระบบเซิร์ฟเวอร์ของคุณ
ใน Delphi 10 Seattle หรือรุ่นใหม่ Delphi อัลกอริทึม HMAC ยังอยู่ใน System.hash Unit ดังนั้นจึงไม่จำเป็นต้องใช้ OpenSSL
อัลกอริทึม HMAC-RSA (ECDSA) ใช้ OPENSSL ดังนั้นหากคุณวางแผนที่จะใช้อัลกอริทึมเหล่านี้เพื่อลงนามโทเค็นของคุณคุณต้องดาวน์โหลดและปรับใช้ OpenSSL (บนเซิร์ฟเวอร์)
โปรดทราบว่าลูกค้าไม่จำเป็นต้องสร้างหรือตรวจสอบโทเค็น (โดยใช้ SHA หรือ RSA) ดังนั้นในฝั่งไคลเอ็นต์ไม่จำเป็นต้องใช้ OpenSSL DLLS
หากคุณต้องการไลบรารี OpenSSL บนเซิร์ฟเวอร์คุณสามารถดาวน์โหลดแพ็คเกจโดยตรงไปยังหน้าโครงการ GitHub ของ Indy (โปรดทราบว่าจะอัปเดตเป็นเวอร์ชันล่าสุดและตรงกับบิตแอปพลิเคชันของคุณเสมอ)
Jose เป็นมาตรฐานที่ให้วิธีการทั่วไปในการลงนามและการเข้ารหัสเนื้อหาใด ๆ Jose ประกอบด้วย 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 และสูงกว่า แต่ฉันยังไม่ได้ลองหรือทดสอบสิ่งนี้
ห้องสมุดนี้ไม่มีการพึ่งพาห้องสมุด/หน่วยภายนอก
ใช้หน่วย Delphi:
เพียงเพิ่มเส้นทางต้นทาง "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 ; อีกวิธีหนึ่งในการทำให้เป็นอนุกรม, deserialize, ตรวจสอบโทเค็นคือการใช้คลาสยูทิลิตี้ 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 ;