Flutter JSON Web Token生成与验证插件dart_jsonwebtoken的使用
Flutter JSON Web Token生成与验证插件dart_jsonwebtoken的使用
JSON Web Token (JWT)
dart_jsonwebtoken 是一个Dart实现的著名JavaScript库 jsonwebtoken 的替代品。JSON Web Tokens是一种开放的、行业标准(RFC 7519)方法,用于在双方之间安全地表示声明。
你可以通过 jwt.io 解码、验证和生成JWT。
示例代码
下面是一个完整的示例demo,展示了如何使用 dart_jsonwebtoken 插件来创建和验证JWT。
导入包
首先,确保你已经在 pubspec.yaml 文件中添加了 dart_jsonwebtoken 依赖:
dependencies:
  dart_jsonwebtoken: ^latest_version # 替换为最新版本号
然后,在你的Dart文件中导入该包:
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
创建 & 签名JWT
接下来,我们将演示如何创建并签名一个JWT。这里我们使用HMAC SHA-256算法作为例子:
void main() {
  // Generate a JSON Web Token
  final jwt = JWT(
    // Payload
    {
      'id': 123,
      'server': {
        'id': '3e4fc296',
        'loc': 'euw-2',
      }
    },
    issuer: 'https://github.com/jonasroussel/dart_jsonwebtoken',
  );
  // Sign it (default with HS256 algorithm)
  final token = jwt.sign(SecretKey('secret passphrase'));
  print('Signed token: $token\n');
}
验证JWT
现在我们已经创建了一个JWT,接下来让我们看看如何验证它:
try {
  // Verify a token (SecretKey for HMAC & PublicKey for all the others)
  final jwt = JWT.verify(token, SecretKey('secret passphrase'));
  print('Payload: ${jwt.payload}');
} on JWTExpiredException {
  print('jwt expired');
} on JWTException catch (ex) {
  print(ex.message); // ex: invalid signature
}
解码但不检查签名
如果你只需要解码而不需要验证签名,可以这样做:
final jwt = JWT.decode(token);
print('Payload: ${jwt.payload}');
支持的算法
以下是 dart_jsonwebtoken 支持的所有算法列表:
| JWT Algorithms | Digital Signature or MAC Algorithm | 
|---|---|
| HS256 | HMAC using SHA-256 hash algorithm | 
| HS384 | HMAC using SHA-384 hash algorithm | 
| HS512 | HMAC using SHA-512 hash algorithm | 
| PS256 | RSASSA-PSS using SHA-256 hash algorithm | 
| PS384 | RSASSA-PSS using SHA-384 hash algorithm | 
| PS512 | RSASSA-PSS using SHA-512 hash algorithm | 
| RS256 | RSASSA-PKCS1-v1_5 using SHA-256 hash algorithm | 
| RS384 | RSASSA-PKCS1-v1_5 using SHA-384 hash algorithm | 
| RS512 | RSASSA-PKCS1-v1_5 using SHA-512 hash algorithm | 
| ES256 | ECDSA using P-256 curve and SHA-256 hash algorithm | 
| ES256K | ECDSA using secp256k curve and SHA-256 hash algorithm | 
| ES384 | ECDSA using P-384 curve and SHA-384 hash algorithm | 
| ES512 | ECDSA using P-521 curve and SHA-512 hash algorithm | 
| EdDSA | EdDSA using ed25519 curve and SHA-512 hash algorithm | 
对于非对称加密算法(如RSA或ECDSA),你需要提供私钥进行签名,并使用相应的公钥进行验证。对于HMAC算法,则只需提供一个共享的秘密密钥即可。
以上就是关于 dart_jsonwebtoken 插件的基本用法介绍。希望这些信息对你有所帮助!如果有任何问题,请随时提问。
更多关于Flutter JSON Web Token生成与验证插件dart_jsonwebtoken的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter JSON Web Token生成与验证插件dart_jsonwebtoken的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用dart_jsonwebtoken插件来生成和验证JSON Web Token (JWT)的示例代码。
首先,确保你已经在你的pubspec.yaml文件中添加了dart_jsonwebtoken依赖:
dependencies:
  flutter:
    sdk: flutter
  dart_jsonwebtoken: ^x.y.z  # 请替换为最新版本号
然后,运行flutter pub get来安装依赖。
以下是一个完整的示例,包括生成JWT和验证JWT的代码:
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:flutter/material.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 Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Generating and Verifying JWT'),
              ElevatedButton(
                onPressed: () async {
                  // Generate JWT
                  String secretKey = 'your_secret_key'; // 请替换为你的密钥
                  Map<String, dynamic> payload = {
                    'iss': 'http://example.org',
                    'aud': 'http://example.com',
                    'iat': DateTime.now().toIso8601String(),
                    'nbf': DateTime.now().add(Duration(seconds: 1)).toIso8601String(),
                    'exp': DateTime.now().add(Duration(hours: 1)).toIso8601String(),
                    'sub': '1234567890',
                    'name': 'John Doe',
                    'admin': true,
                  };
                  JWT jwt = JWT(secretKey);
                  String token = jwt.encode(payload);
                  print('Generated Token: $token');
                  // Verify JWT
                  try {
                    Map<String, dynamic> decoded = jwt.decode(token);
                    print('Decoded Payload: $decoded');
                    // 验证是否过期等,这里仅示例解码后的内容
                    if (decoded != null) {
                      ScaffoldMessenger.of(context).showSnackBar(
                        SnackBar(
                          content: Text('Token is valid'),
                          duration: Duration(seconds: 2),
                        ),
                      );
                    }
                  } catch (e) {
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text('Token is invalid: $e'),
                        duration: Duration(seconds: 2),
                      ),
                    );
                  }
                },
                child: Text('Generate and Verify JWT'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
代码解释:
- 
依赖导入:确保你已经导入了
dart_jsonwebtoken包。 - 
生成JWT:
- 创建一个密钥(
secretKey),这在实际应用中应该是一个安全的密钥。 - 创建一个包含JWT标准字段的
payload(载荷)。 - 使用
JWT类的encode方法生成JWT。 
 - 创建一个密钥(
 - 
验证JWT:
- 使用
JWT类的decode方法解码JWT。 - 捕获可能的异常,如果解码失败(例如,签名不正确或令牌已过期),则会抛出异常。
 
 - 使用
 - 
UI交互:
- 使用
ElevatedButton按钮来触发JWT的生成和验证。 - 使用
ScaffoldMessenger.of(context).showSnackBar来显示验证结果。 
 - 使用
 
请注意,为了简化示例,密钥和载荷都是硬编码的。在实际应用中,密钥应该安全存储,载荷应该根据实际需求动态生成。
        
      
            
            
            
