React+Laravel+JWT登录后获取用户信息触发500错误求助
React + Laravel + JWT 登录后Dashboard请求500错误排查
使用React、Laravel和JWT开发项目,登录后在Dashboard页面请求后端获取用户信息时,返回「Request failed with status code 500」错误。尝试将请求方法从POST改为GET无效,移除Dashboard.js中的http.post请求则无错误,但业务需要该请求获取用户详情。操作完全按照教程执行,但教程代码正常运行,自己的实现出错。
相关代码
Laravel路由(api.php)
Route::post('login', [AuthController::class,'login']); Route::post('register', [AuthController::class,'register']); Route::group(['middleware'=>'api'],function(){ Route::post('logout', [AuthController::class,'logout']); Route::post('refresh', [AuthController::class,'refresh']); Route::post('me', [AuthController::class,'me']); });
React Auth.js
export default function AuthUser(){ const navigate = useNavigate(); const getToken = () =>{ const tokenString = sessionStorage.getItem('token'); const userToken = JSON.parse(tokenString); return userToken; } const getUser = () =>{ const userString = sessionStorage.getItem('user'); const user_detail = JSON.parse(userString); return user_detail; } const [token,setToken] = useState(getToken()); const [user,setUser] = useState(getUser()); const saveToken = (user,token) =>{ sessionStorage.setItem('token',JSON.stringify(token)); sessionStorage.setItem('user',JSON.stringify(user)); setToken(token); setUser(user); navigate('/dashboard'); } const logout = () => { sessionStorage.clear(); navigate('/login'); } const http = axios.create({ baseURL:"http://localhost:8000/api", headers:{ "Content-type" : "application/json", "Authorization" : `Bearer ${token}` } }); return { setToken:saveToken, token, user, getToken, http, logout } }
React Dashboard.js
import { useEffect, useState } from 'react'; import AuthUser from './AuthUser'; export default function Dashboard() { const {http} = AuthUser(); const [userdetail,setUserdetail] = useState(''); useEffect(()=>{ fetchUserDetail(); },[]); const fetchUserDetail = () =>{ http.post('/me').then((res)=>{ setUserdetail(res.data); }); } function renderElement(){ if(userdetail){ return <div> <h4>Name</h4> <p>{userdetail.name}</p> <h4>Email</h4> <p>{userdetail.email}</p> </div> }else{ return <p>Loading.....</p> } } return( <div> <h1 className='mb-4 mt-4'>Dashboard page</h1> { renderElement() } </div> ) }
Laravel日志信息
/Users/myname/smproject/backend/vendor/lcobucci/jwt/src/Signer/BaseSigner.php(44): Lcobucci\JWT\Signer\Hmac->doVerify('\xAB\xE5d\xA5\x10X\x10\xD5\x17\x9C\x80\xAC\xD2\xDD\xBF...', 'eyJ0eXAiOiJKV1Q...', NULL) #1 /Users/myname/smproject/backend/vendor/lcobucci/jwt/src/Signature.php(49): Lcobucci\JWT\Signer\BaseSigner->verify('\xAB\xE5d\xA5\x10X\x10\xD5\x17\x9C\x80\xAC\xD2\xDD\xBF...', 'eyJ0eXAiOiJKV1Q...', NULL) #2 /Users/myname/smproject/backend/vendor/lcobucci/jwt/src/Token.php(202): Lcobucci\JWT\Signature->verify(Object(Lcobucci\JWT\Signer\Hmac\Sha256), 'eyJ0eXAiOiJKV1Q...', NULL) #3 /Users/myname/smproject/backend/vendor/tomfordrumm/jwt-auth/src/Providers/JWT/Lcobucci.php(136): Lcobucci\JWT\Token->verify(Object(Lcobucci\JWT\Signer\Hmac\Sha256), NULL) #4 /Users/myname/smproject/backend/vendor/tomfordrumm/jwt-auth/src/Manager.php(101): Tymon\JWTAuth\Providers\JWT\Lcobucci->decode('eyJ0eXAiOiJKV1Q...') #5 /Users/myname/smproject/backend/vendor/tomfordrumm/jwt-auth/src/JWT.php(200): Tymon\JWTAuth\Manager->decode(Object(Tymon\JWTAuth\Token)) #6 /Users/myname/smproject/backend/vendor/tomfordrumm/jwt-auth/src/JWT.php(136): Tymon\JWTAuth\JWT->getPayload() #7 /Users/myname/smproject/backend/vendor/tomfordrumm/jwt-auth/src/JWT.php(149): Tymon\JWTAuth\JWT->checkOrFail() #8 /Users/myname/smproject/backend/vendor/tomfordrumm/jwt-auth/src/JWTGuard.php(79): Tymon\JWTAuth\JWT->check(true) #9 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php(60): Tymon\JWTAuth\JWTGuard->user() #10 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(63): Tymon\JWTAuth\JWTGuard->check() #11 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(42): Illuminate\Auth\Middleware\Authenticate->authenticate(Object(Illuminate\Http\Request), Array) #12 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Auth\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure), 'api') #13 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #14 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #15 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route)) #16 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route)) #17 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request)) #18 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) #19 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request)) #20 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #21 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure)) #22 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle(Object(Illuminate\Http\Request), Object(Closure)) #23 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #24 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure)) #25 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TrimStrings->handle(Object(Illuminate\Http\Request), Object(Closure)) #26 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #27 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure)) #28 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #29 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle(Object(Illuminate\Http\Request), Object(Closure)) #30 /Users/myname/smproject/backend/vendor/fruitcake/laravel-cors/src/HandleCors.php(52): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #31 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\Cors\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure)) #32 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #33 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Http\Middleware\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure)) #34 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #35 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #36 /Users/myname/smproject/backend/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) #37 /Users/myname/smproject/backend/public/index.php(52): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) #38 /Users/myname/smproject/backend/server.php(21): require_once('/Users/myname...') #39 {main}
错误原因分析
从日志可以看到,JWT验证时传入的密钥为NULL,导致签名验证失败,抛出500错误。核心问题出在Laravel的JWT配置未正确加载,或者React端token携带异常。
解决方案
检查Laravel环境变量
- 打开项目根目录的
.env文件,确认存在JWT_SECRET配置项且值不为空。如果没有,执行命令生成:php artisan jwt:generate - 确保
APP_KEY也已正确生成(执行php artisan key:generate)。
- 打开项目根目录的
清除Laravel配置缓存
执行命令刷新配置,避免缓存导致配置未更新:php artisan config:clear php artisan cache:clear修复React端Axios实例的Token动态设置
当前Auth.js中创建axios实例时,token可能在组件初始化时为null(比如页面刷新后sessionStorage读取延迟),导致请求头的Authorization为空。修改http实例的创建方式,使用请求拦截器动态添加token:const http = axios.create({ baseURL:"http://localhost:8000/api", headers:{ "Content-type" : "application/json" } }); // 添加请求拦截器 http.interceptors.request.use(function (config) { const currentToken = getToken(); if(currentToken){ config.headers.Authorization = `Bearer ${currentToken}`; } return config; }, function (error) { return Promise.reject(error); });验证请求中的Token
在浏览器开发者工具的Network面板中,查看/me请求的Request Headers,确认Authorization头是否包含正确的Bearer {token}格式。如果为空,检查sessionStorage中是否正确存储了token。
内容的提问来源于stack exchange,提问作者Naam
相关产品推荐
相关产品推荐

