我希望能够在flutter(飞镖)中编码JWT令牌并在nodejs中对其进行解码,以便将其用作Firebase的google函数。
问题是当我尝试使用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
,所以我想念什么?
谢谢
答案 0 :(得分:2)
在对JWT进行编码时,在大多数库中,将自动添加“ iat”(issued_at,基本上是创建令牌的时间戳)字段。这意味着,如果对库进行两次编码,则具有相同机密和算法的相同有效负载(无论库如何)都不相同。这可以解释为什么您获得不同的编码值。
这应该是通过设计工作来实现的。检查jwt是否有效的唯一方法不是通过将其与您发出的jwt进行比较,而是通过使用您的机密(只有您,服务器知道)解密它。
此外,除了dart jwt无法验证之外,您的dart jwt的有效负载与node jwt的有效负载也不相同。您可能还想查看为什么会这样,因为它也解释了令牌为何不同!
据我所知,您的解码功能是正确的。您应该尝试这样做以查看令牌的具体问题:
try {
const decoded = jwt.verify(code2,secret);
}
catch(err) {
console.log(err);
}
此外,来自dart的令牌看起来是base64编码的,因此以下代码可以解决您的问题:jwt.verify(Buffer.from(code2, 'base64'), secret)
。