Node.js 使用nodejs编码的jwt令牌解码,使用颤振(dart)生成

Node.js 使用nodejs编码的jwt令牌解码,使用颤振(dart)生成,node.js,dart,flutter,jwt,Node.js,Dart,Flutter,Jwt,我希望能够在flatter(dart)中对JWT令牌进行编码,并在nodejs中对其进行解码,以便将其用作firebase的google函数 问题是,当我尝试使用nodejs对flifter中的编码字符串进行解码时,它会生成一个无效的令牌 在这两种情况下,我都使用HS256加密 这是我的颤振代码: import 'package:jaguar_jwt/jaguar_jwt.dart'; final String emailTrackingJwtSecret = '<SECRET>'

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

问题是,当我尝试使用nodejs对flifter中的编码字符串进行解码时,它会生成一个无效的令牌

在这两种情况下,我都使用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中,当我对获得的相同数据进行编码时:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJrZmlyIiwic2NhbklkIjoiYTEiLCJjb21wb3NlSWQiOiJhMiIsImlhdCI6MTU0NTgzNzEwM30.DWfGOppzqnmGmfP3OFY81S_0l2qR1ATH0nqMG7vcWMw
所以代币是不同的。。我继续读,默认加密是
HS256
,那么我缺少什么呢


谢谢

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

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

此外,除了dart jwt未验证之外,您的有效负载与来自的有效负载不相同。您可能还想看看为什么会出现这种情况,因为它还解释了令牌为何不同

据我所知,你的解码功能是正确的。您应该尝试以下操作,以查看您的令牌有何具体问题:

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

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

谢谢。。“iat”解释了这些变化。。我得到的例外是JsonWebTokenError:无效的令牌一切看起来都正常。确保code2不为空或没有尾随空格,与secret相同…它必须是其他内容。。也许jsonwebtoken包在默认情况下不使用hs256或其他东西。。这里的键变量不包含空格,也不是空的,但您也可以强制它(检查文档)。唯一的其他解决方案是,在编码/解码过程中,secret不相同(请检查\n,空格…)。没有空格或新行。。一次又一次地证实,秘密是一样的。。这是一个简单的代码,我尝试在flatter应用程序和nodejs上运行。。这不是我这边的错误。。我认为有些东西的编码是不同的。每当我用flatter编码时,它总会以“=”结束。有了nodejs,就没有了
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJrZmlyIiwic2NhbklkIjoiYTEiLCJjb21wb3NlSWQiOiJhMiIsImlhdCI6MTU0NTgzNzEwM30.DWfGOppzqnmGmfP3OFY81S_0l2qR1ATH0nqMG7vcWMw
try {
  const decoded = jwt.verify(code2,secret);
}
catch(err) {
  console.log(err);
}