#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 и еще несколько, но я не получаю надлежащих результатов в первую очередь.Итак, если у вас есть какая-либо библиотека, которую вы можете мне порекомендовать, мы всегда рады
Комментарии:
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, он может сгенерировать токен