Flutter应用登录成功后获取用户数据出现401未授权错误的解决方法
解决登录后调用用户数据接口返回401未授权错误的方案
核心问题分析
登录接口返回的响应里包含了新的access_token,但你的登录代码没有将这个token保存到SharedPreferences中,导致后续调用用户数据接口时,仍然使用登录前的旧token,从而触发401未授权错误。
具体修复步骤
1. 修改登录方法,保存新的access_token
更新login函数,在登录成功后提取响应中的access_token并保存到SharedPreferences:
Future<User?> login(String nim, String password) async { String token = await UtilSharedPreferences.getToken(); SharedPreferences pref = await SharedPreferences.getInstance(); try { var body = { 'username': nim, 'password': password, }; var response = await http.post( Uri.parse('http://dev.api.app.masoemuniversity.ac.id/v1/login_mhs'), headers: { 'Authorization': 'Bearer $token', }, body: body, ); print(response.statusCode); print(response.body); if (response.statusCode == 200) { // 解析响应数据 final responseData = jsonDecode(response.body); final user = User.fromJson(responseData); // 提取并保存新的access_token final newAccessToken = responseData['data']['access_token']; await pref.setString('token', newAccessToken); // 匹配UtilSharedPreferences使用的存储key return user; } else { return null; } } catch (e) { print(e); return null; } }
2. 确认Token读取逻辑正确性
确保UtilSharedPreferences.getToken()是从SharedPreferences中读取最新保存的token,示例实现如下:
class UtilSharedPreferences { static Future<String> getToken() async { SharedPreferences pref = await SharedPreferences.getInstance(); return pref.getString('token') ?? ''; } }
3. 额外验证点
- 调用
getDataMahasiswa前,确认登录流程已完成且新token保存成功 - 用JWT解析工具验证登录返回的
access_token,检查过期时间、签名是否有效 - 确认当前用户角色(Mahasiswa)拥有访问用户数据接口的权限
修复后验证流程
- 执行登录操作,通过日志确认新token已存入SharedPreferences
- 调用
getDataMahasiswa,检查请求头的Authorization字段是否使用了新token - 确认接口返回200状态码并成功获取用户数据
内容的提问来源于stack exchange,提问作者sharon
相关产品推荐
相关产品推荐

