引入mORMot-JWT:“新” JWT实现
JWT代表JSON Web令牌,它是一种非常流行的技术,用于跨REST服务实现自定义内容令牌。

JWT:https://jwt.io/

即使它通常被高估了并且有其自身的缺点(特别是在处理安全性时),它也正成为Web和REST应用程序授权/授权机制的事实上的标准。

您可以在此处阅读有关JWT的不错的介绍。https://jwt.io/introduction/

自2015年底以来,我一直使用JWT作为MARS-Curiosity(用于Embarcadero Delphi的REST库)中的身份验证/授权机制的默认实现。JWT库的中心主题当然是关于令牌签名(例如,通过HMAC SHA256),到目前为止,我使用(属于我的一个分支)名为JOSE JWT的库,该库颈椎枕依赖于OpenSSL来实现加密功能,因此迫使您在您的软件中分发OpenSSL。

https://github.com/andrea-magni/MARShttps://en.wikipedia.org/wiki/OpenSSL

考虑到部署OpenSSL越来越成为满足安全要求的负担,并且考虑到Synopse团队不久前在mORMot项目中实现了JWT(链接),我决定(在与Arnaud讨论了几次之后)“窃取”了mORMot JWT子集实施JWT🙂

https://synopse.info/fossil/wiki/Synopse+OpenSource
https://github.com/synopse/mORMot

如果你到过我的一些关于火星的会话,你一定已经看见我挣扎到处都有OpenSSL DLL丢失……好,这一天将要结束!除此之外,还有许多原因可以使MARS项目向前发展:
正如我所说,对应用程序服务器(在Windows平台上)的外部依赖性降低了;
mORMot的实现更快(在某些情况下,至少快5倍,即使我还没有进行严格的基准测试);
mORMot实施背后拥有更强大的社区,因此,我对功能和错误修正更有信心;
这不是我集成到MARS的mORMot的第一篇文章(请参阅MARS中的“ mustache”演示所涵盖的dMustache集成),也许这不是最后一件(我一直想让MARS在mORMot的http服务器上运行) http.sys实现[以及TMS Sparkle和BTW之上],我还考虑使用mORMot高度优化的压缩实用程序为MARS添加内置压缩)。

因此,我在github.com上创建了mORMot-JWT存储库,其中包含相对较小的mORMot文件子集,以在任何Windows应用程序中实现JWT(随时随地使用它吧!我很快会要求jwt.io将其包含在其中Delphi的库列表)。显然,所有代码都是由Synopse团队提供的,我除了在新存储库中复制一些文件外,没有做任何其他事情,试图将其最小化(但不要过多地篡改原始文件,以便于升级到较新版本)。

https://github.com/andrea-magni/mORMot-JWT

这是一个使用示例(链接):https://github.com/andrea-magni/mORMot-JWT/tree/master/ExampleOfUse

uses (...)
, SynCommons, SynCrypto, SynEcc, SynLZ;
var
LJWT: TJWTAbstract;
LToken: string;
begin
LJWT := TJWTHS256.Create(StringToUTF8(ASecret), 0, [jrcIssuer, jrcSubject], [], 60);
try
LToken := UTF8ToString( LJWT.Compute(['LanguageId', 'IT', 'CurrencyId', 'EUR'], 'MyApp', 'TheUser') );
WriteLn('Token: ' + LToken);
finally
LJWT.Free;
end;
end;

  

然后,我将MARS重构为同时支持JOSE和mORMot-JWT库,其方式是mORMot-JWT将是所有Windows平台的默认实现,并且仍将JOSE保留用于非Windows平台(mORMot当前不支持Delphi Linux编译器和ARC-启用了Delphi编译器),还添加了测试以确保两个库在整个MARS中具有一致的行为。

请通过添加以下包含在单元中的IFDEF(在Server.Ignition.pas文件或您定义TMARSEngine实例的任何位置)来升级您的MARS项目

{$IFDEF MSWINDOWS}
, MARS.mORMotJWT.Token
{$ELSE}
, MARS.JOSEJWT.Token
{$ENDIF}

  

并且还记得在重新编译MARS软件包组之前,在您的库路径中添加'(...)MARS / ThirdParty / mORMot / Source'。