使用Dart SDK时,PocketBase用户Token过期后如何重新认证?
PocketBase Dart SDK 令牌过期后的重新认证方案
你之前对auth-refresh接口的理解有误——它不是依赖过期的access token,而是依赖登录时返回的refreshToken(长期有效,除非用户主动登出、密码变更或被后台吊销)。只要refreshToken有效,哪怕access token过期,也能通过它获取新的令牌对。结合Dart SDK,有以下实用方案:
1. 利用SDK自动令牌刷新(推荐)
PocketBase Dart SDK内置了自动令牌刷新逻辑,只要正确持久化登录后的令牌对,就能自动处理access token过期的情况:
步骤:
- 登录成功后,将返回的
token(access token)和refreshToken持久化到本地(比如用shared_preferences) - 初始化SDK时,从本地加载令牌并注入到
authStore
示例代码:
import 'package:pocketbase/pocketbase.dart'; import 'package:shared_preferences/shared_preferences.dart'; // 全局PocketBase实例 final pb = PocketBase('https://your-pb-host.com'); // 用户登录并持久化令牌 Future<void> userLogin(String email, String password) async { final authResult = await pb.collection('users').authWithPassword(email, password); // 保存令牌到本地缓存 final prefs = await SharedPreferences.getInstance(); await prefs.setString('pb_access_token', authResult.token); await prefs.setString('pb_refresh_token', authResult.refreshToken); } // 初始化PocketBase时加载本地令牌 Future<void> initPocketBase() async { final prefs = await SharedPreferences.getInstance(); final accessToken = prefs.getString('pb_access_token'); final refreshToken = prefs.getString('pb_refresh_token'); if (accessToken != null && refreshToken != null) { pb.authStore.save(accessToken, refreshToken); } }
之后你发起任何需要认证的请求时,SDK会自动检查access token有效性:
- 如果未过期,直接使用
- 如果已过期,自动调用
auth-refresh接口用refreshToken获取新的令牌对,并更新authStore。你可以监听authStore.onChange事件,同步更新本地缓存的令牌。
2. 处理refreshToken也失效的情况
如果refreshToken也过期(比如用户长期未使用),此时SDK会抛出ClientException(状态码401),这时候确实需要引导用户重新登录,但可以优化体验:
- 在请求前通过
pb.authStore.isValid快速判断令牌状态,提前引导登录 - 捕获请求时的401异常,再触发登录流程
示例代码:
try { // 发起需要认证的数据请求 final user = await pb.collection('users').getOne(pb.authStore.model.id); } on ClientException catch (e) { if (e.statusCode == 401) { // refreshToken已失效,跳转到登录页面让用户重新登录 // Navigator.push(context, MaterialPageRoute(builder: (_) => LoginPage())); } }
3. 关键注意事项
- 绝对不要存储用户密码:refreshToken是安全的替代方案,它只能用来刷新令牌,无法直接获取用户敏感信息,且可被后台随时吊销
- 监听
authStore.onChange事件:当令牌刷新或用户登出时,同步更新本地缓存,避免下次启动时令牌不一致 - 后台配置:确保你的PocketBase实例中,用户集合的
refreshTokenTTL设置合理(默认是7天,可在集合设置的"API规则"中调整)
内容的提问来源于stack exchange,提问作者RINDAMAN
相关产品推荐
相关产品推荐

