декодирование с помощью jjt, закодированного в nodejs, создание с флаттером (дротик) - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу иметь возможность кодировать токен JWT во флаттере (дротик) и декодировать его в nodejs, чтобы использовать его в качестве функции Google для Firebase.

проблема в том, что закодированныйстрока в флаттере выдает недопустимый токен, когда я пытаюсь декодировать его с помощью nodejs.

в обоих случаях я использую шифрование 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, так что мне не хватает?

спасибо

1 Ответ

0 голосов
/ 26 декабря 2018

Когда вы кодируете JWT, в большинстве библиотек автоматически добавляется поле «iat» (выпущено_ в основном отметка времени, на которой был создан токен).Это означает, что одна и та же полезная нагрузка с одним и тем же секретом и алгоритмом, независимо от библиотеки, не будет одинаковой, если вы дважды ее закодируете.Это может объяснить, почему вы получаете разные закодированные значения.

Вот как это должно работать по проекту .Единственный способ проверить, является ли jwt действительным, состоит не в сравнении его с выданным вами jwt, а в расшифровке его с вашим секретом (который знает только вы, сервер).

Кроме того, помимо фактачто дротик jwt не проверяется, полезная нагрузка вашего дротика jwt не совпадает с полезной нагрузкой с узла jwt .Вы также можете проверить, почему это так, потому что это также объясняет, почему токен отличается!

Насколько я понимаю, ваша функция декодирования верна.Вы должны попробовать это, чтобы увидеть, что конкретно не так с вашим токеном:

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

Кроме того, токен от dart выглядит в кодировке base64, поэтому следующий код может решить вашу проблему: jwt.verify(Buffer.from(code2, 'base64'), secret).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...