Flutter JWT令牌生成与解析插件dart_jwt_token的使用

Flutter JWT令牌生成与解析插件dart_jwt_token的使用

Dart JWT包允许你创建JWT令牌。

安装

  1. 在你的项目pubspec.yaml文件中添加以下依赖:
dependencies:
  dart_jwt_token: ^0.0.2
  1. 使用命令行安装包:
$ dart pub get
  1. 导入包并在你的Flutter应用中使用它:
import 'package:dart_jwt_token/dart_jwt_token.dart';

使用

创建JWT令牌

String createToken(
    {required Map payload,
    required Map<String, dynamic> headers,
    required SecretKey key}) {
  String token = "";
  final jwt = JWT(payload, header: headers);
  token = jwt.sign(key);
  return token;
}

验证JWT令牌

Map<String, dynamic> verifyToken(String token, SecretKey key) {
  try {
    final jwt = JWT.verify(token, key);
    return jwt.payload;
  } on JWTExpiredError {
    return {"expired": true};
  } on JWTError catch (ex) {
    return {"Error": ex.message};
  }
}

示例代码

以下是完整的示例代码,展示了如何生成和验证JWT令牌。

import 'package:dart_jwt_token/dart_jwt_token.dart';

void main() {
  hs256();
}

// 创建JWT令牌的函数
String createToken(
    {required Map payload,
    required Map<String, dynamic> headers,
    required SecretKey key}) {
  String token = "";
  final jwt = JWT(payload, header: headers);
  token = jwt.sign(key); // 签名令牌
  return token;
}

// HS256算法示例
void hs256() {
  String token;
  Map payload = {"name": "John Doe", "age": 30}; // 载荷数据
  Map<String, dynamic> headers = {'alg': 'HS256', 'typ': 'JWT'}; // 头部信息
  SecretKey key = SecretKey('Secret Paraphrase'); // 秘钥

  token = createToken(payload: payload, headers: headers, key: key); // 生成令牌
  print('Signed token:\n$token\n'); // 打印签名后的令牌

  Map<String, dynamic> decodedPayload = verifyToken(token, key); // 验证令牌
  print("Payload:\n$decodedPayload\n"); // 打印解码后的载荷
}

// 验证JWT令牌的函数
Map<String, dynamic> verifyToken(String token, SecretKey key) {
  try {
    // 验证令牌
    final jwt = JWT.verify(token, key);
    return jwt.payload;
  } on JWTExpiredError {
    return {"expired": true};
  } on JWTError catch (ex) {
    return {"Error": ex.message};
  }
}

更多关于Flutter JWT令牌生成与解析插件dart_jwt_token的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JWT令牌生成与解析插件dart_jwt_token的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用dart_jwt_token插件来生成和解析JWT令牌的示例代码。这个插件允许你轻松地在Flutter应用中处理JWT(JSON Web Tokens)。

首先,确保你已经在你的pubspec.yaml文件中添加了dart_jwt_token依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_jwt_token: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

以下是一个完整的示例,包括生成JWT和解析JWT的代码:

import 'package:flutter/material.dart';
import 'package:dart_jwt_token/dart_jwt_token.dart';
import 'dart:convert';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter JWT Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter JWT Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  String token = await generateJWT();
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(
                      content: Text('Generated Token: $token'),
                    ),
                  );
                },
                child: Text('Generate JWT'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  String token = 'your_jwt_token_here'; // 替换为你的JWT令牌
                  try {
                    Map<String, dynamic> decoded = await parseJWT(token);
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text('Decoded Payload: ${jsonEncode(decoded)}'),
                      ),
                    );
                  } catch (e) {
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text('Error parsing JWT: $e'),
                      ),
                    );
                  }
                },
                child: Text('Parse JWT'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<String> generateJWT() async {
    // 创建一个密钥(在实际应用中,请确保密钥的安全性)
    final secret = 'your_256_bit_secret';
    
    // 创建一个JWT负载
    final payload = {
      'iss': 'http://example.org',
      'aud': 'http://example.com',
      'iat': DateTime.now().millisecondsSinceEpoch ~/ 1000,
      'nbf': DateTime.now().millisecondsSinceEpoch ~/ 1000,
      'exp': (DateTime.now().add(Duration(hours: 1))).millisecondsSinceEpoch ~/ 1000,
      'sub': '1234567890',
      'name': 'John Doe',
      'admin': true,
    };

    // 使用 dart_jwt_token 插件生成JWT
    Jwt jwt = Jwt(secret);
    return jwt.encode(payload);
  }

  Future<Map<String, dynamic>> parseJWT(String token) async {
    // 使用 dart_jwt_token 插件解析JWT
    Jwt jwt = Jwt('your_256_bit_secret'); // 请确保这里的密钥与生成JWT时使用的密钥相同
    return jwt.decode(token);
  }
}

在这个示例中:

  1. 我们创建了一个Flutter应用,其中有两个按钮:一个用于生成JWT,另一个用于解析JWT。
  2. generateJWT函数使用dart_jwt_token插件生成一个JWT令牌。它创建了一个负载(payload),其中包括发行者(iss)、受众(aud)、签发时间(iat)、生效时间(nbf)、过期时间(exp)、主题(sub)、用户名称(name)和是否是管理员(admin)等信息。
  3. parseJWT函数使用dart_jwt_token插件解析一个JWT令牌,并返回解码后的负载。

请注意,在实际应用中,你应该妥善管理你的密钥,并确保它们的安全性。另外,JWT令牌通常包含敏感信息,因此在客户端处理时需要格外小心。

回到顶部