【问题标题】:decoding with nodejs encoded jwt token make with flutter(dart)使用 nodejs 编码的 jwt 令牌进行解码 使用颤振(飞镖)制作
【发布时间】:2019-05-24 19:43:12
【问题描述】:

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

当我尝试在颤振中使用相同的秘密对相同的数据进行编码时,我得到以下令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDU5MjMwNTgsImlhdCI6MTU0NTgzNjY1OCwicGxkIjp7ImNvbXBvc2VJZCI6ImEyIiwic2NhbklkIjoiYTEiLCJ1aWQiOiJrZmlyIn19.INf2n8J3yA4KPlYToARNCJnDvDQWcobWs-abaPCn_FE=

在 nodejs 中,当我对得到的相同数据进行编码时:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJrZmlyIiwic2NhbklkIjoiYTEiLCJjb21wb3NlSWQiOiJhMiIsImlhdCI6MTU0NTgzNzEwM30.DWfGOppzqnmGmfP3OFY81S_0l2qR1ATH0nqMG7vcWMw

所以令牌不同.. 我在https://github.com/auth0/node-jsonwebtoken 上阅读,默认加密是HS256,所以我错过了什么?

谢谢

【问题讨论】:

    标签: node.js dart flutter jwt


    【解决方案1】:

    当您对 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)

    【讨论】:

    • 谢谢..“iat”解释了变化..我得到的异常是 JsonWebTokenError: invalid token
    • 一切正常。确保code2不为空或没有尾随空格,与secret相同...
    • 它必须是别的东西..也许jsonwebtoken包默认不使用hs256或其他东西..关键变量不包含空格并且它不是空的
    • 确实如此,但您也可以强制执行(查看文档)。只有其他解决方案在编码/解码期间是不一样的(检查 \n、空格...)
    • 没有空格或新行.. 一次又一次地确认秘密是相同的.. 这是我尝试在颤振应用程序和 nodejs 上运行的简单代码.. 这不是我的错误..我认为某些东西的编码方式不同。每当我用颤振编码时,它都会以“=”结尾。与nodejs它没有
    猜你喜欢
    • 2019-02-05
    • 2022-09-24
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多