
JWT (JSON Web Token) 및 Jose (JSON 객체 서명 및 암호화) 사양 스위트의 Delphi 구현. 이 라이브러리는 여러 Jose 알고리즘과 함께 JWS (JWE 지원이 계획되어 있음) 소형 직렬화를 지원합니다.

Delphi 10 시애틀 이전에 HMAC-SHA 알고리즘은 Indy 라이브러리를 통해 OpenSSL을 사용하므로 토큰을 생성하려면 서버 시스템에 OpenSSL DLL이 있어야합니다.
델파이 10 시애틀 또는 최신 델파이 버전에서는 HMAC 알고리즘도 시스템에 있습니다.
HMAC-RSA (ECDSA) 알고리즘은 필수 OpenSSL을 사용하므로 이러한 알고리즘을 사용하여 토큰에 서명하려면 서버에서 OpenSSL을 다운로드하여 배포해야합니다.
클라이언트가 토큰 (SHA 또는 RSA 사용)을 생성하거나 확인할 필요가 없으므로 클라이언트 측에서는 OpenSSL DLL이 필요하지 않습니다.
서버에서 OpenSSL 라이브러리가 필요한 경우 패키지를 Indy의 GitHub 프로젝트 페이지로 직접 다운로드 할 수 있습니다 (항상 최신 버전으로 업데이트하고 응용 프로그램의 비트에 맞게 일치하려면).
Jose는 모든 콘텐츠의 서명 및 암호화에 대한 일반적인 접근 방식을 제공하는 표준입니다. Jose는 여러 RFC로 구성됩니다.
| 알고리즘 | 지원 |
|---|---|
exp | ✔️ |
iat | ✔️ |
nbf | ✔️ |
aud | ✔️ |
iss | ✔️ |
jti | ✔️ |
typ | ✔️ |
TJOSEProducer 및 TJOSEProducerBuilder (별칭 TJOSEProcess ) 클래스를 위해 많은 옵션이있는 새로운 소형 토큰을 구축합니다. TJOSEConsumer 및 TJOSEConsumerBuilder 클래스는 세분화가 좋은 토큰을 검증합니다.| 알고리즘 | 지원 |
|---|---|
None | ✔️ 사용하지 마십시오! ? |
HS256 | ✔️ |
HS384 | ✔️ |
HS512 | ✔️ |
RS256 | ✔️ 업데이트되었습니다! |
RS384 | ✔️ 업데이트되었습니다! |
RS512 | ✔️ 업데이트되었습니다! |
ES256 | ✔️ NEW! ? |
ES384 | ✔️ NEW! ? |
ES512 | ✔️ NEW! ? |
ES256K | ✔️ NEW! ? |
None 알고리즘 취약점의 영향을받지 않습니다.이 도서관은 Delphi 12 Athens , Delphi 11 Alexandria , Delphi 10.4 Sydney , 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 객체는 유창한 인터페이스를 사용하여 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 ;