代码之家  ›  专栏  ›  技术社区  ›  ufk

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

  •  1
  • ufk  · 技术社区  · 7 年前

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

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

    这是我的颤振代码:

    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;
    } 
    

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

    当我尝试在Flatter中使用相同的密码对相同的数据进行编码时,我得到以下标记:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDU5MjMwNTgsImlhdCI6MTU0NTgzNjY1OCwicGxkIjp7ImNvbXBvc2VJZCI6ImEyIiwic2NhbklkIjoiYTEiLCJ1aWQiOiJrZmlyIn19.INf2n8J3yA4KPlYToARNCJnDvDQWcobWs-abaPCn_FE=
    

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJrZmlyIiwic2NhbklkIjoiYTEiLCJjb21wb3NlSWQiOiJhMiIsImlhdCI6MTU0NTgzNzEwM30.DWfGOppzqnmGmfP3OFY81S_0l2qR1ATH0nqMG7vcWMw
    

    所以代币是不同的。。我继续读下去 https://github.com/auth0/node-jsonwebtoken 默认加密是 HS256 那么我错过了什么?

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  3
  •   frsechet    7 年前

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

    这就是它的工作原理 有意 . 检查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) .