如何从 Dart 中的 jwt 令牌中提取过期时间?

thi*_*ode 8 dart

我从 api 收到 jwt 令牌,但我不知道如何从 Dart 中的令牌中提取过期时间。

收到的令牌

eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InN1amVldGg5MTE3MUBnbWFpbC5jb20iLCJ1c2VySWQiOiI1ZThhZGFlNDIxMDg3MzM1ODBmNDA4NTgiLCJpYXQiOjE1ODYxNTgzMzysI mV4cCI6MTU4Njc2MzEzNn0.EwLTdRXaibNmcbuqVxzEDSfrW37z3eWYIxAifAUST5I

Sen*_*dru 5

一个优雅的解决方案是使用该jwt_decoder包。 https://pub.dev/packages/jwt_decoder

  1. flutter pub add jwt_decoder
  2. 导入它:

import 'package:jwt_decoder/jwt_decoder.dart';

  1. 获取所有 JWT 属性:
    String yourToken = "Your JWT";
    Map<String, dynamic> decodedToken = JwtDecoder.decode(yourToken);
Run Code Online (Sandbox Code Playgroud)

或者仅检查过期情况(如果是这种情况):

String yourToken = "Your JWT";
bool hasExpired = JwtDecoder.isExpired(yourToken);
Run Code Online (Sandbox Code Playgroud)


gha*_*bat 0

你可以通过解码来做到这一点,一般来说,JWT token 由两部分(对象)组成,在上面的 JWT 中解码的结果是:

{
  alg: "HS256",
  typ: "JWT"
}.
{
  email: "sujeeth91171@gmail.com",
  userId: "5e8adae42108733580f40858",
  iat: 1586158336,
  exp: 1586763136
}.
Run Code Online (Sandbox Code Playgroud)

因此,过期日期是一个时间戳 (1586763136),代表 2020 年 4 月 13 日星期一上午 7:32:16。

如何 ?

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));
}
Run Code Online (Sandbox Code Playgroud)

Dart 代码致谢:boformer