node.js - 用 nodejs 编码的 jwt token 解码用 flutter(dart) 制作

标签 node.js dart flutter jwt

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

问题是当我尝试用 nodejs 解码时,flutter 中的编码字符串会产生无效标记。

在这两种情况下,我都使用 HS256 加密。

这是我的 flutter 代码:

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 中使用相同的 secret 对相同的数据进行编码时,我得到以下标记:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDU5MjMwNTgsImlhdCI6MTU0NTgzNjY1OCwicGxkIjp7ImNvbXBvc2VJZCI6ImEyIiwic2NhbklkIjoiYTEiLCJ1aWQiOiJrZmlyIn19.INf2n8J3yA4KPlYToARNCJnDvDQWcobWs-abaPCn_FE=

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

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJrZmlyIiwic2NhbklkIjoiYTEiLCJjb21wb3NlSWQiOiJhMiIsImlhdCI6MTU0NTgzNzEwM30.DWfGOppzqnmGmfP3OFY81S_0l2qR1ATH0nqMG7vcWMw

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

谢谢

最佳答案

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

这就是它应该如何工作的设计。检查 jwt 是否有效的唯一方法不是将它与你发布的 jwt 进行比较,而是用你的 secret 解码它(只有你,服务器,知道)。

此外,除了 dart jwt 未验证这一事实之外,您的 dart jwt 的有效负载与来自 node jwt 的有效载荷不同.您可能还想查看为什么会这样,因为它也解释了 token 不同的原因!

据我所知,您的解码功能是正确的。您应该尝试这样做以查看您的 token 具体有什么问题:

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

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

关于node.js - 用 nodejs 编码的 jwt token 解码用 flutter(dart) 制作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53933840/

相关文章:

flutter - 如何在 VSCode 中将 Flutter 项目导出为 ZIP?

flutter - 如何创建一个 BlocListener 来监听 flutter 中的所有页面并访问 MaterialApp 上下文?

node.js - 如何将 MEAN 堆栈部署到我的托管服务器?

firebase - 如何遍历 Firebase datasnapshot 子子项? flutter

node.js - heroku bash 无法识别 sequelize 命令

firebase - 未处理的异常 : Invalid argument: Instance of 'Encrypted'

flutter - 为什么在参数声明之前定义构造函数?

flutter - 如何在 FLUTTER 中几秒钟后重定向到 Stream Builder 中的另一个屏幕/页面?

javascript - 错误: data and salt arguments required (am i missing something)?

javascript - 如何通过 app.js 将另一个 .js 文件所需的函数传递到 index.ejs View