Flutter JSON Web Token生成与验证插件dart_jsonwebtoken的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter JSON Web Token生成与验证插件dart_jsonwebtoken的使用

JSON Web Token (JWT)

pub version

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

1 回复

更多关于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'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖导入:确保你已经导入了dart_jsonwebtoken包。

  2. 生成JWT

    • 创建一个密钥(secretKey),这在实际应用中应该是一个安全的密钥。
    • 创建一个包含JWT标准字段的payload(载荷)。
    • 使用JWT类的encode方法生成JWT。
  3. 验证JWT

    • 使用JWT类的decode方法解码JWT。
    • 捕获可能的异常,如果解码失败(例如,签名不正确或令牌已过期),则会抛出异常。
  4. UI交互

    • 使用ElevatedButton按钮来触发JWT的生成和验证。
    • 使用ScaffoldMessenger.of(context).showSnackBar来显示验证结果。

请注意,为了简化示例,密钥和载荷都是硬编码的。在实际应用中,密钥应该安全存储,载荷应该根据实际需求动态生成。

回到顶部