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
相关产品推荐
相关产品推荐

