Flutter JWT生成插件jwt_generator的使用

Flutter JWT生成插件jwt_generator的使用

概述

此包用于使用rsa_pkcs和pointycastle生成JWT。

功能

  • JWT GENERATOR 生成JWT

安装

对于Dart项目使用:

dart pub add jwt_manager

对于Flutter项目使用:

flutter pub add jwt_manager

你也可以手动编辑pubspec.yaml文件:

dependencies:
  jwt_manager: ^0.0.1

然后运行dart pub getflutter pub get来完成安装。

使用

示例:

import 'package:jwt_generator/jwt_generator.dart';

void main() {
  // 创建一个令牌
  final tokenDto = FcmTokenDto(
    iss: 'some@email.com',
    iat: DateTime(2001),
  );

  // 这个私钥是由AI生成的
  final pemPrivateKey = '''
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAy1YRVTIxeB6YU88f6OhsHtZUB0ll/9Wi72lgzohPRHkHHb3J
y193Y41wmtYNhxY9GHQ6QjciXP4LtQUqf+WOf70O9x3xDJLPuHx8Zw25Cz+S4r0t
KnSNnh7gBi0QJ5PYv+gIJxgV/QlQFVencXbpaohkU/LInxVMoo8bkta160OOBSW2
5JBSxF8tY49SDfxcLyh91BD+E/8cOplGAXaYyPbsVUn76Y83JZ+jIzZWXNvap9Xq
SbfqXzjVQuOQ/XdrQOS5u1c+F6OzWgdSa7OBj479yzfuh7z+W+NpZAKjFihvh1ME
nnLd61Htu/1D5/L/zkv+lZ5sjAps0aWRkwZ+CQIDAQABAoIBADI8BjY1G1GgxWNX
NXv2B9gqfUH7mS52WjWppBgCRwsUl3R6keMjp7w5kks+fMMV9GwZMtdvBZdR0BSd
vR0x2l2mmI7mn8nKb3UVlCplkoS75Q8NS55Eg0RAPnpoIaiVdyQaMAFwiuYjqdxL
9nsqtIn0Pk0bGwNqYK98iYRidTk026KsYrZGSb/Ya0DlBJYOMQnDslPmebGgbZro
9opVaceLpYaklQa2Q7cF4M2MRcKAK//wb2t2aPQ+LmtZGfnyW0z/ZZB8loaMClCU
k0vLcRPt8OuzGUO+9it8GT9JjW59HTEhYtkBs9dLr3yWeSOiUraienNGAEwRSALe
sYyFiTECgYEA5ITum3Vw339C5KByBek3wmFSWhxokgtJfUe33hgqFeSB4Cs8rJri
B8zc00q4WSoXWH7zz/lJm4DCUHl+U7ycppQYovVfuoegXC784uihW4XwPWc4r3yH
agpNancSkLVkWznDGafpQxq7YbK21hYdVRoaw9Y36fO1/9zw+xIHJGUCgYEA48nd
HoXL0v062IdoJ/dgm+RO97iYCDtVzRCYvv65Toa0n5mA+W6IFcJzKFWjE8/eiqoV
/Vl+UXu8QG0g6elVgdHEyoR5ZzX5jjaNl4ZAyzY9Oubh3pj8N6xq1deAOjjBPQNZ
z+NRchG43GJ7m0Z7lajmaMc0PLVNe7SUY7sF/tUCgYBEoriX8LoqJqsMyDP3Goko
1NpLPmUaGFHGUxgimNdrI+ruTY43uX1SInHg9HxSK5Y/ekH4oUM+dXnnedY7iFb0
oV6U82YBPGMpzOMftAdi2ePCTZJ1As4ZR2bhJ0poNFMkI0E6H3isMwc83NSVkKbW
vLR1RY4dspljdBTdFBkZEQKBgGzzNlHNCOpHuIesbEMBbTHjB2ow3nbBeo50q7pe
t185ytazYx7qoShXMyFNpIxrVjPYml/tGB/9INNn3uBCfGV1YbzDlBWrmUtOCHc6
/W606KBtogcIAUrXqtnRE0HFt5dpLOHkBiabF2JBsIFaOu4gNORUs0V+KitK+dah
s4JpAoGAd+YLoCWwe+2P7EqhiGi0eUcqFyTvOsxxRCTsBWWkf2P0SorjjYcmlw2G
iLxH64ZqxyJNdI1wYkGYVxoTdB5jFRP3X7QPDv5v0iMs6iLX0e3XHkUQZSpij2rq
UmUIGqLdAx3FNG0CO/HLr+kc8vkeDTkBKYtDm4r9Ik9IquF4MUc=
-----END RSA PRIVATE KEY-----
''';

  // 这个公钥是由AI生成的
  final pemPublicKey = '''
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy1YRVTIxeB6YU88f6Ohs
HtZUB0ll/9Wi72lgzohPRHkHHb3Jy193Y41wmtYNhxY9GHQ6QjciXP4LtQUqf+WO
f70O9x3xDJLPuHx8Zw25Cz+S4r0tKnSNnh7gBi0QJ5PYv+gIJxgV/QlQFVencXbp
aohkU/LInxVMoo8bkta160OOBSW25JBSxF8tY49SDfxcLyh91BD+E/8cOplGAXaY
yPbsVUn76Y83JZ+jIzZWXNvap9XqSbfqXzjVQuOQ/XdrQOS5u1c+F6OzWgdSa7OB
j479yzfuh7z+W+NpZAKjFihvh1MEnnLd61Htu/1D5/L/zkv+lZ5sjAps0aWRkwZ+
CQIDAQAB
-----END PUBLIC KEY-----
''';

  // 创建一个已编码并签名的令牌

  // RsaKeyParser 从.pem字符串中提取私钥
  final parser = RsaKeyParser();
  final rsaPrivateKey = parser.extractPrivateKey(pemPrivateKey);

  // 创建 RsaSignifier 用于签名
  final rsaSignifier = RsaSignifier(privateKey: rsaPrivateKey);

  // JwtBuilder 将令牌编码为字符串并签名
  final jwtBuilder = JwtBuilder(signifier: rsaSignifier);
  final jwtToken = jwtBuilder.buildToken(tokenDto);

  print('Encoded JWT: $jwtToken');

  // 使用公钥检查签名

  // 从.pem字符串中提取公钥
  final rsaPublicKey = parser.extractPublicKey(pemPublicKey);

  // 验证签名
  final rsaVerifier = RsaSignatureVerifier(publicKey: rsaPublicKey);

  // 使用句点作为分隔符分割JWT
  List<String> rawJwt = jwtToken.split('.');

  // 选择最后一个索引作为base64签名
  String base64signature = rawJwt.last;

  // 移除列表中的最后一项
  rawJwt.removeLast();

  // 使用句点作为模式连接剩余值
  String signedData = rawJwt.join('.');

  final isVerified = rsaVerifier.verify(signedData, base64signature);

  // 记录验证结果
  print('Is signature verified: $isVerified');
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用jwt_generator插件来生成JWT(JSON Web Token)的示例代码。请注意,jwt_generator插件主要用于生成JWT,而不是验证JWT。如果你需要验证JWT,你可能需要使用其他插件,比如flutter_jwt_decode

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

dependencies:
  flutter:
    sdk: flutter
  jwt_generator: ^x.y.z  # 请将x.y.z替换为当前最新版本号

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

以下是一个完整的示例,展示了如何使用jwt_generator来生成JWT:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('JWT Generator Example'),
        ),
        body: Center(
          child: FutureBuilder<String>(
            future: generateJWT(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                } else {
                  return Text('Generated JWT: ${snapshot.data}');
                }
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }

  Future<String> generateJWT() async {
    // 创建JWT负载(Payload)
    Map<String, dynamic> payload = {
      'iss': 'http://example.com',  // 发行人
      'aud': 'http://example.org',  // 接收人
      'iat': DateTime.now().millisecondsSinceEpoch ~/ 1000,  // 签发时间
      'exp': (DateTime.now().add(Duration(days: 1))).millisecondsSinceEpoch ~/ 1000,  // 过期时间
      'data': {
        'userId': '123456',
        'username': 'john_doe',
      },
    };

    // 创建JWT头部(Header)
    Map<String, dynamic> header = {
      'typ': 'JWT',
      'alg': 'HS256',  // 使用HMAC SHA-256签名算法
    };

    // 密钥(Secret Key),用于签名JWT
    String secretKey = 'your_256_bit_secret';  // 请确保使用足够长的密钥以保证安全性

    // 使用jwt_generator生成JWT
    Jwt jwt = Jwt(header, payload, secretKey);
    String token = jwt.generate();

    return token;
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,该应用在启动时生成一个JWT并将其显示在屏幕上。

注意事项

  1. 密钥管理:在实际应用中,密钥的管理非常重要。不要将密钥硬编码在客户端代码中。考虑使用安全存储或环境变量来管理密钥。
  2. 时间戳iat(签发时间)和exp(过期时间)字段使用了Unix时间戳(秒)。
  3. 算法选择:在示例中,我们使用了HS256(HMAC SHA-256)算法。根据你的需求,你可以选择其他算法。
  4. 依赖版本:确保你使用的是jwt_generator的最新版本。你可以在pub.dev网站上查看最新版本号。

这个示例应该能够帮助你理解如何在Flutter项目中使用jwt_generator插件来生成JWT。如果你有更多问题或需要进一步的帮助,请随时提问。

回到顶部