我正在编写Flutter / Dart应用程序,并从具有某些需要使用的声明的身份验证服务器取回JWT。我看过各种Dart JWT库(到目前为止有4个),但是它们要么都太旧了,不能再与Dart 2一起使用,等等。或者它们需要解密JWT的秘密,这是没有道理的,也是不正确的(或可能因为我没有访问权限)。
那么-如何在“现代” Dart / Flutter应用程序中获得JWT并从中获得要求?
答案 0 :(得分:17)
JWT令牌只是base64编码的JSON字符串(其中3个,用点分隔):
import 'dart:convert';
Map<String, dynamic> parseJwt(String token) {
final parts = token.split('.');
if (parts.length != 3) {
throw Exception('invalid token');
}
final payload = _decodeBase64(parts[1]);
final payloadMap = json.decode(payload);
if (payloadMap is! Map<String, dynamic>) {
throw Exception('invalid payload');
}
return payloadMap;
}
String _decodeBase64(String str) {
String output = str.replaceAll('-', '+').replaceAll('_', '/');
switch (output.length % 4) {
case 0:
break;
case 2:
output += '==';
break;
case 3:
output += '=';
break;
default:
throw Exception('Illegal base64url string!"');
}
return utf8.decode(base64Url.decode(output));
}
答案 1 :(得分:0)
在撰写本文时,jaguar_jwt软件包正在积极维护中。尽管没有明确记录,但它确实具有将解码Base64Url编码的公共方法。它基本上与接受的答案相同。
//import 'package:jaguar_jwt/jaguar_jwt.dart';
final String token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTQ4MjAxNjIsImlhdCI6MTU1NDc3Njk2MiwiaXNzIjoiU3VyYWdjaCIsInN1YiI6IjQifQ.bg5B_k9WCmxiu2epuZo_Tpt_KZC4N9ve_2GEdrulcXM';
final parts = token.split('.');
final payload = parts[1];
final String decoded = B64urlEncRfc7515.decodeUtf8(payload);
这给出了一个JSON字符串,对于此特定示例为:
{
"exp":1554820162,
"iat":1554776962,
"iss":"Suragch",
"sub":"4"
}
答案 2 :(得分:0)
使用'base64Url.normalize()'函数。 那就是_decodeBase64()从上面的答案中所做的!
String getJsonFromJWT(String splittedToken){
String normalizedSource = base64Url.normalize(encodedStr);
return utf8.decode(base64Url.decode(normalizedSource));
}