如何通过Laravel Auth Sanctum API在React Native中获取当前登录用户数据
解决Laravel Sanctum + React Native 获取登录用户数据失败的问题
一、修复Laravel路由冲突
你当前定义了两个重复的/user GET路由,后一个会覆盖前一个。而且不带auth:sanctum中间件的路由根本无法获取登录用户——Sanctum必须通过中间件验证请求中的令牌才能识别用户。
只保留带中间件的路由即可,删除第二个无效路由:
// api.php Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); });
二、修复React Native请求逻辑
你的axios请求没有携带认证令牌,导致Laravel无法识别当前登录用户,所以返回空数据。另外还有两个细节问题需要修正:
import { useState, useEffect } from 'react'; import AsyncStorage from '@react-native-async-storage/async-storage'; import axios from 'axios'; // 配置axios基础地址,替换成你的Laravel API实际地址 axios.defaults.baseURL = 'http://你的Laravel服务器IP:端口'; const ProfileScreen = () => { const [user, setUser] = useState({}); const getUser = async () => { try { const token = await AsyncStorage.getItem('auth_token'); if (!token) { console.log('未找到用户认证令牌'); return; } // 请求时携带Authorization头,将令牌传给Laravel const res = await axios.get("/api/user", { headers: { 'Authorization': `Bearer ${token}` } }); console.log(res.data); setUser(res.data); } catch (e) { // 打印更详细的错误信息,方便排查 console.log('请求失败:', e.response?.data || e.message); } }; // 添加空依赖数组,避免组件重复渲染时无限调用getUser useEffect(() => { getUser(); }, []); return ( // 你的界面渲染代码 <></> ); }; export default ProfileScreen;
三、额外排查点
- 确认用户登录时,你已经将Sanctum返回的令牌正确存入了AsyncStorage的
auth_token键中。 - 如果Laravel和React Native不在同一域名/IP下,需要修改Laravel的
config/cors.php配置:
// cors.php return [ 'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], 'allowed_origins' => ['http://你的React Native调试地址'], 'allowed_headers' => ['*'], 'supports_credentials' => true, ];
内容的提问来源于stack exchange,提问作者motionless570
相关产品推荐
相关产品推荐

