一尘不染

如何在Flutter应用程序中从JWT获得索赔

flutter

我正在编写Flutter / Dart应用程序,并从具有一些需要使用的声明的身份验证服务器获取JWT。我看过各种Dart
JWT库(到目前为止有4个),但是它们要么都太旧了,不能再与Dart
2一起使用,等等。或者它们需要解密JWT的秘密,这是没有意义的,也是不正确的(或有可能,因为我没有访问权限)。

因此,如何在“现代” Dart / Flutter应用程序中获得JWT并从中获得要求?


阅读 441

收藏
2020-08-13

共1个答案

一尘不染

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));
}
2020-08-13