Токены JWT - это 3 строки Base64, разделенные знаком «.».

  • Часть 1 называется Заголовок. он содержит алгоритм и тип токена.
  • Часть 2 называется Payload. он содержит пользовательские данные.
  • Часть 3 называется Подпись. Что рассчитывается следующим образом:
<Hashing Algo: e.g. HMACSHA256 etc>(
    base64UrlEncode(header) + "." + base64UrlEncode(payload), "secret string<Known to JWT creator>"
);

Как разработчик приложений, нас больше всего интересует декодирование полезной нагрузки для получения сведений о пользователе, таких как идентификатор почты, время сеанса и т. Д. Итак, мы начнем с разделения JWT на 3 части.

final parts = token.split('.');
if (parts.length != 3) {
  throw Exception('invalid token');
}

Теперь декодируйте строку в кодировке Base64, чтобы получить полезную нагрузку JSON.

import 'dart:convert';
String decodeBase64(String str) {
  //'-', '+' 62nd char of encoding,  '_', '/' 63rd char of encoding
  String output = str.replaceAll('-', '+').replaceAll('_', '/');
  switch (output.length % 4) { // Pad with trailing '='
    case 0: // No pad chars in this case
      break;
    case 2: // Two pad chars
      output += '==';
      break;
    case 3: // One pad char
      output += '=';
      break;
    default:
      throw Exception('Illegal base64url string!"');
  }

  return utf8.decode(base64Url.decode(output));
}

Вышеупомянутая функция вернет строку Json с полезной нагрузкой.

//0: Header, 1: Payload, 2: Signature
final payload = _decodeBase64(parts[1]); 
final payloadMap = json.decode(payload); //Map dictionary 

Полный код: