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