Как сгенерировать JWT в flutter из ключа?

#java #flutter #dart #jwt

#java #flutter #dart #jwt

Вопрос:

У меня есть сгенерировать токен из ключа в flutter.Этот токен будет служить заголовком (авторизацией) для запроса вызова API. Я используюhttps://pub.dev/packages/dart_jsonwebtoken плагин для генерации токена

Я могу сгенерировать токен, используя алгоритм HS256. Но в моем случае я должен сгенерировать токен, используя алгоритм RS256.Когда я пытаюсь сгенерировать с использованием алгоритма RS256, он выдает следующий экземпляр ошибки ‘JWTInvalidError’. Вы также можете сослаться на скриншот.

Ключ действителен, потому что в коде Java человек смог это реализовать.Чего не хватает?

Это код, который я реализовал с помощью пакета flutter dart_jsonwebtoken:

 import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';

String token;

void dartJsonWebTokenGenerator() {
  Duration delay = new Duration( minutes:3);
  final jwt = JWT(
    payload:
    {
      "version": "13",
    'user_id': 'XXXXXXXXX',
    },
    issuer: 'https://github.com/jonasroussel/jsonwebtoken',
    audience: 'live-tv',
  );


// Sign it (default with HS256 algorithm)
  token = jwt.sign(PrivateKey('XXXXXXXXXXXXXXXXXXXXXXXXX'),
      algorithm: JWTAlgorithm.RS256,expiresIn: delay );

  print('Signed token: $tokenn');
}
  

Эквивалентный Java-код, который должен быть реализован:

 import android.util.Log;

import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Date;
import java.util.concurrent.TimeUnit;


public class RSAKeyGenerator {
    private static PrivateKey getPrivateKey() throws GeneralSecurityException {
        String pKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        KeyFactory kf = KeyFactory.getInstance("RSA");
        byte[] decode;
        decode = android.util.Base64.decode(pKey, android.util.Base64.DEFAULT);
        PKCS8EncodedKeySpec keySpecPKCS8 = new PKCS8EncodedKeySpec(decode);
        return kf.generatePrivate(keySpecPKCS8);
    }
    public static String getJwtToken() {
        final long VALIDITY_MS = TimeUnit.MINUTES.toMillis(60);
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        Date exp = new Date(nowMillis   VALIDITY_MS);
        PrivateKey privateKey = null;
        try {
            privateKey = getPrivateKey();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
        String jws = Jwts.builder()
                .claim("version", "13")
                .claim("user_id", "xxxxxxxxxxxxxxxxxxx")
                .setIssuedAt(now)
                .setExpiration(exp)
                .signWith(privateKey, SignatureAlgorithm.RS256)
                .setAudience("live-tv")
                .compact();
        Log.d("111__", jws);
        SpUtil.Companion.getInstance().putString(J_TOKEN, jws);
        return jws;
    }
}
  

Наряду с этим я попробовал библиотеку jose, corsac_jwt и еще несколько, но я не получаю надлежащих результатов в первую очередь.Итак, если у вас есть какая-либо библиотека, которую вы можете мне порекомендовать, мы всегда рады

Ошибка токена RSA 256

Комментарии:

1. Вы проверили на jwt.io содержимое вашего токена? Не могли бы вы вставить его сюда?

2. @xurei используя HS256, я мог бы проверить содержимое моего токена в jwt.io . Это нормально

3. Тогда я бы предположил, что в полезной нагрузке отсутствуют некоторые обязательные поля или что подпись недействительна. Можете ли вы проверить исключение и посмотреть, предоставлены ли какие-либо подробности?

4. Он указывает на этот блок кода в библиотеке jsonwebtoken @override List<int> sign(Key key, тело списка<int>) { assert (ключ — это PrivateKey, ‘ключ должен быть PrivateKey’); окончательный PrivateKey = ключ как PrivateKey; окончательный анализатор = RSAPKCSParser(); пара RSAKeyPair; попробуйте { pair = parser.parsePEM ( PrivateKey.key, пароль: PrivateKey.passphrase); assert(pair.private != null); } catch (ex) { выбросить JWTInvalidError(‘недопустимый закрытый ключ RSA’); }

5. Таким образом, это в основном говорит о недопустимом закрытом ключе. Но, используя код Java, он может сгенерировать токен