Flutter JWT认证插件pharaoh_jwt_auth的使用

Flutter JWT认证插件pharaoh_jwt_auth的使用

简介

此模块通过dart_jsonwebtoken包提供了Pharaoh中间件来验证JWT(JSON Web Tokens)。解码后的JWT负载可通过req.auth在请求对象上可用。

安装

在您的pubspec.yaml文件中添加以下依赖项:

dependencies:
  pharaoh: ^0.0.5+6
  pharaoh_jwt_auth:

然后运行以下命令以安装依赖项:

flutter pub get

基本用法

以下是一个简单的示例,展示如何使用pharaoh_jwt_auth插件进行JWT认证。

示例代码

import 'package:pharaoh/pharaoh.dart'; // 导入Pharaoh框架
import 'package:pharaoh_jwt_auth/pharaoh_jwt_auth.dart'; // 导入JWT认证插件

void main() async {
  final app = Pharaoh(); // 创建Pharaoh应用实例

  // 使用jwtAuth中间件,传入一个密钥生成函数
  app.use(jwtAuth(secret: () => SecretKey('some-secret-key')));

  // 定义一个路由,返回"Hello World"
  app.get('/', (req, res) => res.ok('Hello World'));

  // 启动服务器监听
  await app.listen();
}

代码说明

  1. 导入必要的库

    • pharaoh: 提供Pharaoh框架的核心功能。
    • pharaoh_jwt_auth: 提供JWT认证的中间件。
  2. 创建Pharaoh应用实例

    final app = Pharaoh();
    
  3. 使用JWT认证中间件

    app.use(jwtAuth(secret: () => SecretKey('some-secret-key')));
    
    • jwtAuth是一个中间件,用于验证JWT令牌。
    • secret参数是一个函数,返回一个SecretKey对象,用于生成和验证JWT签名。
  4. 定义路由

    app.get('/', (req, res) => res.ok('Hello World'));
    
    • 定义了一个根路径/的GET请求处理程序,返回"Hello World"。
  5. 启动服务器

    await app.listen();
    
    • 启动服务器并开始监听请求。

测试

您可以使用以下命令运行测试以确保插件正常工作:

dart test

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

1 回复

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


pharaoh_jwt_auth 是一个用于 Flutter 的 JWT(JSON Web Token)认证插件,它可以帮助你在 Flutter 应用中轻松实现基于 JWT 的用户认证和授权。以下是如何使用 pharaoh_jwt_auth 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 pharaoh_jwt_auth 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  pharaoh_jwt_auth: ^1.0.0  # 请使用最新版本

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

2. 初始化 JWT 认证

在你的 Flutter 应用中,你需要初始化 pharaoh_jwt_auth 插件。通常,你可以在 main.dart 文件中进行初始化:

import 'package:flutter/material.dart';
import 'package:pharaoh_jwt_auth/pharaoh_jwt_auth.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 JWT 认证
  await PharaohJwtAuth.init(
    secretKey: 'your_secret_key',  // 你的 JWT 密钥
    tokenExpiration: Duration(days: 7),  // Token 过期时间
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter JWT Auth',
      home: HomeScreen(),
    );
  }
}

3. 生成 JWT Token

在用户登录成功后,你可以使用 PharaohJwtAuth.generateToken 方法生成 JWT Token:

import 'package:pharaoh_jwt_auth/pharaoh_jwt_auth.dart';

Future<void> login(String username, String password) async {
  // 假设你已经验证了用户的用户名和密码
  if (username == 'user' && password == 'password') {
    // 生成 JWT Token
    String token = await PharaohJwtAuth.generateToken(
      payload: {'userId': '123', 'username': username},
    );

    // 保存 Token 到本地存储(例如 SharedPreferences)
    await saveTokenToLocalStorage(token);
  } else {
    throw Exception('Invalid credentials');
  }
}

4. 验证 JWT Token

在需要验证用户身份的地方,你可以使用 PharaohJwtAuth.verifyToken 方法来验证 JWT Token:

import 'package:pharaoh_jwt_auth/pharaoh_jwt_auth.dart';

Future<void> verifyUserToken() async {
  // 从本地存储中获取 Token
  String token = await getTokenFromLocalStorage();

  if (token != null) {
    try {
      // 验证 Token
      Map<String, dynamic> payload = await PharaohJwtAuth.verifyToken(token);

      // 如果验证成功,可以继续处理业务逻辑
      print('User ID: ${payload['userId']}');
      print('Username: ${payload['username']}');
    } catch (e) {
      // Token 验证失败
      print('Token verification failed: $e');
    }
  } else {
    print('No token found');
  }
}

5. 刷新 JWT Token

如果 Token 即将过期,你可以使用 PharaohJwtAuth.refreshToken 方法来刷新 Token:

import 'package:pharaoh_jwt_auth/pharaoh_jwt_auth.dart';

Future<void> refreshToken() async {
  // 从本地存储中获取旧的 Token
  String oldToken = await getTokenFromLocalStorage();

  if (oldToken != null) {
    try {
      // 刷新 Token
      String newToken = await PharaohJwtAuth.refreshToken(oldToken);

      // 保存新的 Token 到本地存储
      await saveTokenToLocalStorage(newToken);
    } catch (e) {
      // Token 刷新失败
      print('Token refresh failed: $e');
    }
  } else {
    print('No token found');
  }
}

6. 注销用户

在用户注销时,你可以简单地删除本地存储中的 Token:

Future<void> logout() async {
  // 删除本地存储中的 Token
  await deleteTokenFromLocalStorage();
}

7. 处理 Token 过期

你可以在应用启动时检查 Token 是否过期,并在必要时刷新或要求用户重新登录:

import 'package:pharaoh_jwt_auth/pharaoh_jwt_auth.dart';

Future<void> checkTokenExpiration() async {
  // 从本地存储中获取 Token
  String token = await getTokenFromLocalStorage();

  if (token != null) {
    try {
      // 检查 Token 是否过期
      bool isExpired = await PharaohJwtAuth.isTokenExpired(token);

      if (isExpired) {
        // Token 已过期,要求用户重新登录
        print('Token expired, please login again');
      } else {
        // Token 未过期,继续使用
        print('Token is still valid');
      }
    } catch (e) {
      // Token 验证失败
      print('Token verification failed: $e');
    }
  } else {
    print('No token found');
  }
}

8. 使用 Token 进行 API 请求

在需要发送 API 请求时,你可以将 JWT Token 添加到请求头中:

import 'package:http/http.dart' as http;

Future<void> fetchUserData() async {
  // 从本地存储中获取 Token
  String token = await getTokenFromLocalStorage();

  if (token != null) {
    var response = await http.get(
      Uri.parse('https://api.example.com/user'),
      headers: {
        'Authorization': 'Bearer $token',
      },
    );

    if (response.statusCode == 200) {
      // 处理响应数据
      print('User data: ${response.body}');
    } else {
      print('Failed to fetch user data');
    }
  } else {
    print('No token found');
  }
}
回到顶部