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();
}
代码说明
-
导入必要的库:
pharaoh
: 提供Pharaoh框架的核心功能。pharaoh_jwt_auth
: 提供JWT认证的中间件。
-
创建Pharaoh应用实例:
final app = Pharaoh();
-
使用JWT认证中间件:
app.use(jwtAuth(secret: () => SecretKey('some-secret-key')));
jwtAuth
是一个中间件,用于验证JWT令牌。secret
参数是一个函数,返回一个SecretKey
对象,用于生成和验证JWT签名。
-
定义路由:
app.get('/', (req, res) => res.ok('Hello World'));
- 定义了一个根路径
/
的GET请求处理程序,返回"Hello World"。
- 定义了一个根路径
-
启动服务器:
await app.listen();
- 启动服务器并开始监听请求。
测试
您可以使用以下命令运行测试以确保插件正常工作:
dart test
更多关于Flutter JWT认证插件pharaoh_jwt_auth的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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');
}
}