使用nodejs编码的jwt令牌解码,使用flutter(dart)制作



我希望能够在flutter(dart)中编码JWT令牌,并在nodejs中对其进行解码,以便将其用作firebase的谷歌函数。

问题是,当我尝试用nodejs解码时,flutter中的编码字符串会产生一个无效的令牌。

在这两种情况下,我都使用HS256加密。

这是我的颤振代码:

import 'package:jaguar_jwt/jaguar_jwt.dart';
final String emailTrackingJwtSecret = '<SECRET>';
String generateEmailTrackingJwtToken(String uid, String scanId, String composeId) {
final claimSet = new JwtClaim(
payload: {<PAYLOAD_DATA>}
);
final String token = issueJwtHS256(claimSet, emailTrackingJwtSecret);
print(token);
return token;
} 

这是我解码它的nodejs代码:

const jwt = require('jsonwebtoken');
const secret='<SECRET>';
const decoded = jwt.verify(code2,secret);

当我试图在flutter中用相同的秘密对相同的数据进行编码时,我得到了以下令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDU5MjMwNTgsImlhdCI6MTU0NTgzNjY1OCwicGxkIjp7ImNvbXBvc2VJZCI6ImEyIiwic2NhbklkIjoiYTEiLCJ1aWQiOiJrZmlyIn19.INf2n8J3yA4KPlYToARNCJnDvDQWcobWs-abaPCn_FE=

在nodejs中,当我对得到的相同数据进行编码时:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJrZmlyIiwic2NhbklkIjoiYTEiLCJjb21wb3NlSWQiOiJhMiIsImlhdCI6MTU0NTgzNzEwM30.DWfGOppzqnmGmfP3OFY81S_0l2qR1ATH0nqMG7vcWMw

所以代币是不同的。。我继续阅读https://github.com/auth0/node-jsonwebtoken默认加密是HS256,那么我缺少什么呢?

谢谢

在对JWT进行编码时,在大多数库中,都会自动添加一个"iat"(issued_at,基本上是创建令牌的时间戳)字段。这意味着,如果对具有相同秘密和算法的相同有效载荷进行两次编码,无论库是什么,都将不相同。这可以解释为什么您得到不同的编码值。

这就是它的工作方式通过设计。检查jwt是否有效的唯一方法不是将其与您发布的jwt进行比较,而是用您的秘密(只有您,服务器,知道)对其进行解码。

此外,除了dart jwt没有验证这一事实之外,您的dart jwt的有效载荷与来自节点jwt的载荷不同。您可能还想了解为什么会出现这种情况,因为这也解释了代币不同的原因!

据我所知,你的解码功能是正确的。你应该尝试一下,看看你的代币到底出了什么问题:

try {
const decoded = jwt.verify(code2,secret);
}
catch(err) {
console.log(err);
}

此外,来自dart的令牌看起来是base64编码的,因此以下代码可以解决您的问题:jwt.verify(Buffer.from(code2, 'base64'), secret)

最新更新