来自中间件的react-laravel重定向问题

时间:2017-10-16 09:07:04

标签: php laravel jwt

我没有使用react-router,只是简单地使用了反应刀片。喜欢 以下:

articleManage.blade.php

@extends('layout')
@section('content')
    <div id="articleManage"></div>
@stop

我尝试使用jwt身份验证,但它确实有效。 这是我的jwt auth中间件:

authJWT.php

try {
    $token = JWTAuth::parseToken();
    if (! $token->authenticate()) {
        return response()->json(['user_not_found'], 404);
    }
} catch (Exception $e) {
    if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException){
        return response()->json(['error'=>'Token is Invalid 1']);
    }else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException){
        return response()->json(['error'=>'Token is Expired 2']);
    }else{
        return response()->json(['error'=>'Something is wrong 3']);
    }
}
return $next($request);

现在我遇到了中间件上的重定向问题,因为当我改变它时,它将无法正常工作:

try {
    $token = JWTAuth::parseToken();
    if (! $token->authenticate()) {
        return response()->json(['user_not_found'], 404);
    }
} catch (Exception $e) {
    ……
    return redirect('/');
}
return $next($request);

这是我收到的错误消息:

TypeError: Cannot read property 'map' of undefined
    at ArticleManage.render (app.js:54105)
    at app.js:50033
    at measureLifeCyclePerf (app.js:49313)
    at ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (app.js:50032)
    at ReactCompositeComponentWrapper._renderValidatedComponent (app.js:50059)
    at ReactCompositeComponentWrapper._updateRenderedComponent (app.js:49983)
    at ReactCompositeComponentWrapper._performComponentUpdate (app.js:49961)
    at ReactCompositeComponentWrapper.updateComponent (app.js:49882)
    at ReactCompositeComponentWrapper.performUpdateIfNecessary (app.js:49798)
    at Object.performUpdateIfNecessary (app.js:2916)

知道如何在令牌错误时重定向?



10/17:这是我的程序流程

articleManage.js

let url = 'load-article';
let config = {
headers: {'Authorization': 'Bearer '+localStorage.getItem('token')}
};

axios.get(url,config).then(response=>{
    this.setState({'articles':response.data.articles});
}).catch(function (error) {
    console.log(error);
});

web.php

Route::get('/load-article', 'API\ArticleController@read')->middleware('jwt-auth');    

ArticleController @读

public function read(Request $request){
    $header = $request->header('Authorization');
    $articles = Article::All();
    return response()->json(['articles' => $articles]);
}

现在我更改了中间件,因为我想尝试重定向,然后我收到错误。

public function handle($request, Closure $next)
{
//        try {
//            $token = JWTAuth::parseToken();
//            if (! $token->authenticate()) {
//                return response()->json(['user_not_found'], 404);
//            }
//        } catch (Exception $e) {
//            if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException){
//                return response()->json(['error'=>'Token is Invalid 1']);
//            }else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException){
//                return response()->json(['error'=>'Token is Expired 2']);
//            }else{
//                return response()->json(['error'=>'Something is wrong 3']);
//            }
//        }
//        return $next($request);

    return redirect('/');
}

1 个答案:

答案 0 :(得分:0)

在黑暗中拍摄,因为你没有发布整个articleManager组件。但是,请确保您在所有错误响应中传递某种失败状态代码标头。否则,Axios将读取response()->json(['error'=>'Token is Invalid 1'])成功并尝试设置状态。由于response.data.articles未定义,这就是您收到错误的原因。因此,请将authJWT.php中的中间件更改为:

} catch (Exception $e) {
    if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException) {
        return response()->json(['error'=>'Token is Invalid 1'], 500);
    } else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException) {
        return response()->json(['error'=>'Token is Expired 2'], 500);
    } else {
        return response()->json(['error'=>'Something is wrong 3'], 500);
    }
}