Flutter如何实现JWT认证
在Flutter中如何实现JWT认证?想在后端使用Node.js生成JWT令牌,但不太清楚Flutter端的具体实现步骤。目前主要遇到以下几个问题:
- 如何在Flutter中安全存储JWT令牌?
- 发送请求时应该如何携带JWT令牌?
- 如何正确处理JWT过期和刷新令牌的逻辑? 有没有完整的代码示例可以参考?或者推荐一些好用的Flutter JWT认证插件?
2 回复
Flutter中实现JWT认证通常使用dart:convert解码token,结合shared_preferences存储token。发送请求时在header添加Authorization: Bearer <token>。推荐使用http或dio库处理网络请求,并验证token有效期。
更多关于Flutter如何实现JWT认证的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中实现JWT认证,主要通过以下步骤:
1. 接收和存储JWT
import 'package:shared_preferences/shared_preferences.dart';
// 存储Token
Future<void> saveToken(String token) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('jwt_token', token);
}
// 读取Token
Future<String?> getToken() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString('jwt_token');
}
// 删除Token(退出登录)
Future<void> removeToken() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('jwt_token');
}
2. 网络请求携带JWT
使用http或dio包发送请求时,在header中添加Token:
import 'package:dio/dio.dart';
Future<void> fetchUserData() async {
String? token = await getToken();
Dio dio = Dio();
dio.options.headers = {
'Authorization': 'Bearer $token',
'Content-Type': 'application/json'
};
try {
Response response = await dio.get('https://api.example.com/user');
print(response.data);
} catch (e) {
print('请求失败: $e');
}
}
3. Token自动刷新(可选)
// 检查Token是否即将过期
bool isTokenExpired(String token) {
// 解析JWT payload(实际项目建议使用jwt_decode包)
final parts = token.split('.');
if (parts.length != 3) return true;
final payload = _decodeBase64(parts[1]);
final payloadMap = json.decode(payload);
final exp = payloadMap['exp'] as int;
final currentTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;
return exp - currentTime < 300; // 5分钟内过期
}
// 刷新Token
Future<String?> refreshToken() async {
// 实现刷新逻辑,通常调用特定API
}
4. 完整认证流程示例
class AuthService {
Future<bool> login(String email, String password) async {
try {
Response response = await Dio().post(
'https://api.example.com/login',
data: {'email': email, 'password': password},
);
if (response.statusCode == 200) {
await saveToken(response.data['token']);
return true;
}
} catch (e) {
print('登录失败: $e');
}
return false;
}
Future<void> logout() async {
await removeToken();
// 跳转到登录页面
}
}
关键点:
- 使用
shared_preferences安全存储Token - 每个请求在Header中添加
Authorization: Bearer <token> - 处理Token过期和自动刷新
- 考虑使用拦截器自动管理Token(Dio支持)
建议使用dio包配合拦截器实现更完善的认证流程,可以自动处理Token刷新和重试逻辑。

