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

Flutter动态用户认证及Token存入SharedPreferences问题

解决动态获取Token并适配HttpConnectionOptions的问题

1. 修复getToken方法,正确解析API返回的Token

原来的方法硬编码了用户名密码,还错误处理了响应体,现在改成使用传入的登录参数,并通过Auth类正确解析Token:

Future<String?> getToken(String password, String login) async {
  Map<String, String> headers = {
    'Content-Type': 'application/json',
    'accept': '*/*'
  };
  final body = {
    'username': login, // 使用用户输入的用户名
    'password': password, // 使用用户输入的密码
  };
  var response = await http.post(
    Uri.parse("http://mylink/login"),
    headers: headers,
    body: jsonEncode(body),
  );
  if (response.statusCode == 200) {
    // 用Auth类解析响应体,直接提取token
    Auth auth = authFromJson(response.body);
    return auth.token;
  }
  return null;
}

2. 调整登录逻辑,存入带Bearer前缀的完整Token

登录成功后直接给Token加上Bearer 前缀再存入SharedPreferences,避免后续重复拼接:

ElevatedButton(
  onPressed: () async {
    var username = _loginController.text;
    var password = _passwordController.text;
    var jwt = await ProviderService().getToken(password, username);
    if (jwt != null) {
      // 拼接Bearer前缀后存入
      await SharedPreferenceService().setToken("Bearer $jwt");
      Navigator.pushNamed(context, '/mainPageAdmin');
    } else {
      displayDialog(context);
    }
  },
)

3. 重构SharedPreferenceService,移除固定Token实现动态获取

删掉固定的tokens变量,让loginWithToken直接从SharedPreferences读取登录时存入的动态Token:

class SharedPreferenceService {
  SharedPreferences? _prefs;

  // 初始化SharedPreferences实例
  Future<bool> initSharedPreferences() async {
    try {
      _prefs = await SharedPreferences.getInstance();
      return true;
    } catch (e) {
      print("shared preferences error : $e");
      return false;
    }
  }

  // 存入Token
  Future<void> setToken(String token) async {
    if (_prefs == null) await initSharedPreferences();
    await _prefs?.setString('token', token);
  }

  // 清除Token
  Future<void> clearToken() async {
    if (_prefs == null) await initSharedPreferences();
    await _prefs?.clear();
  }

  // 获取Token的快捷getter
  Future<String> get token async {
    if (_prefs == null) await initSharedPreferences();
    return _prefs?.getString('token') ?? '';
  }

  // 适配HttpConnectionOptions的方法,直接返回存储的动态Token
  Future<String> loginWithToken() async {
    bool isInitialized = await initSharedPreferences();
    if (isInitialized) {
      return await token;
    }
    return '';
  }
}

4. 验证HttpConnectionOptions配置

现在loginWithToken会动态读取登录后存入的Token,直接适配原配置即可:

final httpConnectionOptions = HttpConnectionOptions(
  accessTokenFactory: () => SharedPreferenceService().loginWithToken(),
);

内容的提问来源于stack exchange,提问作者user16357470

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:05:45