Dart 如何在我的颤振应用程序中从JWT获得索赔

Dart 如何在我的颤振应用程序中从JWT获得索赔,dart,jwt,flutter,Dart,Jwt,Flutter,我正在编写一个flatter/Dart应用程序,并且正在从一个auth服务器获得一个JWT,该服务器有一些声明我需要使用。我已经看过了各种Dart JWT库(到目前为止有4个),但它们要么太旧,不再使用Dart 2,等等。要么它们需要破解JWT的秘密,这毫无意义,也不正确(或者因为我没有访问权限,所以可能) 那么——如何在“现代”飞镖/颤振应用程序中获得JWT并从中获得声明呢 JWT令牌只是base64编码的JSON字符串(其中3个,用点分隔): 导入'dart:convert'; 映射解析JW

我正在编写一个flatter/Dart应用程序,并且正在从一个auth服务器获得一个JWT,该服务器有一些声明我需要使用。我已经看过了各种Dart JWT库(到目前为止有4个),但它们要么太旧,不再使用Dart 2,等等。要么它们需要破解JWT的秘密,这毫无意义,也不正确(或者因为我没有访问权限,所以可能)


那么——如何在“现代”飞镖/颤振应用程序中获得JWT并从中获得声明呢

JWT令牌只是base64编码的JSON字符串(其中3个,用点分隔):

导入'dart:convert';
映射解析JWT(字符串标记){
最终部分=标记分割('.');
如果(零件长度!=3){
抛出异常(“无效令牌”);
}
最终有效载荷=_decodeBase64(第[1]部分);
最终payloadMap=json.decode(有效载荷);
如果(payloadMap是!Map){
抛出异常(“无效负载”);
}
返回payloadMap;
}
字符串_decodeBase64(字符串str){
字符串输出=str.replaceAll('-','+')。replaceAll(''''','/');
开关(输出长度%4){
案例0:
打破
案例2:
输出+='=';
打破
案例3:
输出+='=';
打破
违约:
抛出异常(“非法的base64url字符串!”);
}
返回utf8.decode(base64Url.decode(输出));
}
在撰写本文时,该软件包正在积极维护。尽管没有明确的文档记录,但它确实有一个公共方法,可以解码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"
}
另见:
使用“base64Url.normalize()”函数。 根据上面的答案,_decodeBase64()就是这么做的

String getJsonFromJWT(String splittedToken){
  String normalizedSource = base64Url.normalize(encodedStr);
  return utf8.decode(base64Url.decode(normalizedSource));
}

这太完美了。让我困惑的是填充物——这是一个非常好的例程——谢谢!现在,为什么这个小例程不在一个好的JWT包中,我不知道!:)(或者如果它是不容易看到的!)我想我只是从Dart 1 JWT软件包中取了一个,添加了一些类型,小写常量…谢谢你,它对我有用。我打印utf8.decode(base64url.decode(output))…结果是字符串。我如何只得到一个键值?当你运行
parseJwt()
时,你会得到一个
Map
结果。使用
Map['key']
获取密钥的值。关于JWT与颤振应用程序的配合使用,我有一个问题,如果我们的移动应用程序中有大量用户(1到20万用户),那么JWT实现中允许的最大用户数是否有问题。
String getJsonFromJWT(String splittedToken){
  String normalizedSource = base64Url.normalize(encodedStr);
  return utf8.decode(base64Url.decode(normalizedSource));
}