You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:30:25