如何在没有秘密的情况下检查 JWT 令牌到期时间?

Вяч*_*шов 1 java jwt

在请求中发送之前,我需要检查 JWT 令牌。但是我没有生成这个令牌,我只是通过授权重新接收它,比,我没有秘密。

我用io.jsonwebtoken.jjwt图书馆。

如何使用此库检查令牌到期时间?

phi*_*sch 5

您不需要密钥来读取令牌。该秘密仅用于确保未修改令牌。但是,从库的外观来看,确保您不能跳过签名检查。所以我们需要欺骗它。

在忽略签名的同时访问到期

JWT 由三部分组成,base64 编码并用点分隔: Header.Body.Signature

如果我们删除签名,则库无法检查任何内容。但是,我们还必须访问原始 body ,因为不支持无签名声明。

var signedToken = "eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9...";
var tokenOnly = signedToken.substring(0, signedToken.lastIndexOf('.') + 1);
var expiration = ((Claims)Jwts.parser().parse(tokenOnly).getBody()).getExpiration();
Run Code Online (Sandbox Code Playgroud)

但是,如果不验证签名,您将不知道是否有人修改了令牌。我再怎么强调都不为过:如果您无法验证签名,请不要依赖任何令牌信息。

如何做得更好

看看非对称算法(RS、ES 和 PS 系列)。这允许发行者使用私钥生成 JWT,任何拥有相应公钥的人都可以验证令牌是否有效。通过这种方式,您可以验证和访问您想要的声明,并确保它们是由您信任的发行人发行的,并且没有以任何方式修改。