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

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携带异常。


解决方案

  1. 检查Laravel环境变量

    • 打开项目根目录的.env文件,确认存在JWT_SECRET配置项且值不为空。如果没有,执行命令生成:
      php artisan jwt:generate
      
    • 确保APP_KEY也已正确生成(执行php artisan key:generate)。
  2. 清除Laravel配置缓存
    执行命令刷新配置,避免缓存导致配置未更新:

    php artisan config:clear
    php artisan cache:clear
    
  3. 修复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);
    });
    
  4. 验证请求中的Token
    在浏览器开发者工具的Network面板中,查看/me请求的Request Headers,确认Authorization头是否包含正确的Bearer {token}格式。如果为空,检查sessionStorage中是否正确存储了token。

内容的提问来源于stack exchange,提问作者Naam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:29:50