用nodejs编码的jwt令牌使用flutter进行解码(dart)

时间:2018-12-26 15:15:23

标签: node.js dart flutter jwt

我希望能够在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,所以我想念什么?

谢谢

1 个答案:

答案 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)