如何通过 ES265 算法创建 JSON Web 令牌?

问题描述

我使用:Delphi JOSE and JWT LibraryOpenSSL libraries 1.0.2 版

uses
 ...
  JSON,System.DateUtils,JOSE.Core.JWT,JOSE.Core.JWS,JOSE.Core.JWK,JOSE.Core.JWA;
...

procedure TForm1.Button1Click(Sender: TObject);
var
  LToken: TJWT;
  LSigner: TJWS;
  LKey: TJWK;
  LAlg: TJOSEAlgorithmId;
  LPrivateKey,LPublicKey,LClaims,LHeader: TJSONObject;
  LKeys: TKeyPair;
begin
  LToken := TJWT.Create;

  LPrivateKey := TJSONObject.Create;
  LPrivateKey.AddPair('kty','EC');
  LPrivateKey.AddPair('alg','ES256');
  LPrivateKey.AddPair('crv','P-256');
  LPrivateKey.AddPair('x','sDbcYT8HzBk1tUl849ZHrhpIn8ZV7HfD1DwYdsP1ip0');
  LPrivateKey.AddPair('y','EWodfKWQ6oE0ppyi7tRO_61BgAQsZyDjDGj9kLZiUts');
  LPrivateKey.AddPair('d','Rwyv99W3GnfjYbI0X-b5Umhvh88oRCKQkPxiwCPVGgg');

  LKeys := TKeyPair.Create;
  LKeys.PrivateKey.Key := LPrivateKey.ToString;

  LClaims := TJSONObject.Create;
  LClaims.AddPair('email','myemail@mail.com');
  LClaims.AddPair('aud','usr');
  LClaims.AddPair('iat',TJSONNumber.Create(DateTimetoUnix(TTimeZone.Local.ToUniversalTime(Now))));
  LClaims.AddPair('jti','0x'+IntToHex(Random(High(Integer))));

  LHeader := TJSONObject.Create;
  LHeader.AddPair('alg','ES256');
  LHeader.AddPair('kid','1');
    
  LToken.Header.JSON := LHeader;
  LToken.Claims.JSON := LClaims;
    
  LAlg := TJOSEAlgorithmId.ES256;

  LSigner := TJWS.Create(LToken);
  LSigner.Skipkeyvalidation := True;

  // Sign the token!
  LSigner.Sign(LKeys.PrivateKey,LAlg);

  Memo1.Lines.Add('Header: ' + LSigner.Header);
  Memo1.Lines.Add('Payload: ' + LSigner.Payload);
  Memo1.Lines.Add('Signature: ' + LSigner.Signature);
  Memo1.Lines.Add('Compact Token: ' + LSigner.CompactToken);
end;

签名令牌时出现错误

 Exception class ESignException with message '[ECDSA] Unable to load private key:
 error:0906D06C:lib(9):func(109):reason(108)'

我怀疑私钥需要以不同的格式提交。在 Delphi JOSE 和 JWT 库示例中,私钥存储在 PM 文件中,格式如下:

-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIFzS3/5bCnrlpa4902/zkYzUQF6E2D8pazgnKu4smhpQoAoGCCqLSM49
AwEHoUQDQgBEqTjyg2z65i+zbyUXW8BQ+K87DNsICRaEH7Fy7Nm3MseXy9ItSCQU
VeJbtO6kYUA00mx7bKoC1sx5sbtFExnYPQ==
-----END EC PRIVATE KEY-----

它看起来像 base64,但是当我将密钥转换为 base64 时,库返回相同的错误。我很乐意提供任何建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)