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

React Native集成Laravel Breeze时遭遇Token不匹配及未认证问题

React Native集成Laravel Breeze时遭遇Token不匹配及未认证问题

看起来你已经走完了大部分对接流程,但在Laravel Sanctum的移动应用认证细节上踩了几个小坑,我来帮你逐一梳理解决:

1. 核心错误:混淆了SPA与移动应用的Token使用方式

你登录后拿到的plainTextToken是Sanctum的API Token,但你把它当成了SPA场景下的X-XSRF-TOKEN来设置,这是完全错误的!

移动应用属于无状态的API客户端,应该用Bearer Token方式携带认证信息,而非依赖XSRF Cookie。修正你的登录代码:

try {
  const response = await axios.post('http://192.168.1.105:8000/api/sanctum/token', {
    email: email,
    password: password,
    device_name: 'mobile',
  });
  const authToken = response.data;
  // 正确设置Bearer认证头
  axios.defaults.headers.common['Authorization'] = `Bearer ${authToken}`;
  // 建议把token存在AsyncStorage,方便后续会话复用
  await AsyncStorage.setItem('auth_token', authToken);
} catch (error) {
  console.log(error);
  Alert.alert('Login Failed', 'Please check your credentials and try again.');
}

2. Logout路由逻辑不匹配移动应用场景

你自定义的/sanctum/logout路由调用了AuthenticatedSessionController::logout,但这个方法是为Web会话认证设计的,它会清除Session和Cookie,并不适用于移动应用的Token认证模式。

你需要修改后端路由,直接操作Token的撤销:

use Illuminate\Http\Request;

Route::middleware('auth:sanctum')->group(function () {
    Route::post('/sanctum/logout', function (Request $request) {
        // 撤销当前正在使用的这个Token
        $request->user()->currentAccessToken()->delete();
        // 如果需要撤销该用户所有Token,可替换为:$request->user()->tokens()->delete();
        return response()->json(['message' => 'Logout successful']);
    });
});

3. Stateful Domains配置对移动应用无效

你在sanctum.php里配置的stateful域名列表是给浏览器端SPA用的,移动应用是无状态的Token认证,这个配置对你的场景完全没用,可以忽略,不用纠结里面的域名是否正确。

4. 额外提示:关闭不必要的Cookie携带

移动应用中Axios默认不会自动携带Cookie,而我们用Bearer Token认证也不需要Cookie,所以确保你的Axios没有开启withCredentials(默认就是关闭的),避免不必要的干扰。

按照以上步骤调整后,你的Logout接口应该就能正常返回成功,不会再出现Token不匹配或未认证的问题了。

备注:内容来源于stack exchange,提问作者maganthro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:07:59