我希望能够在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)
。