【问题标题】:Is there anyway to handle authorization token mismatch error无论如何要处理授权令牌不匹配错误
【发布时间】:2023-03-11 03:22:01
【问题描述】:

我是 laravel 和 laravel-passport 的新手,我在媒体 here 上关注这篇文章

一切都如我所愿,直到我尝试处理错误,如果用户在详细信息方法中发送了错误的授权令牌

这是错误:

无效参数异常

Route [login] 未定义。

我正在使用最新的 laravel 5.7 和护照 7.1

我试过了

第一个 sn-p

  • 尝试捕捉显示方法中的错误

第二个sn-p

  • 处理/app/exceptions/handler.php中的token不匹配异常 我猜这不是令牌不匹配异常

第三个sn-p

  • 甚至在 Handler.php 文件中错过了一点 laravel 核心

在未经身份验证的方法中但没有希望

/routes/api.php

Route::get('user/login', 'AuthController@login');

// user
Route::get('users/find', 'UserController@index');

//here i am trying this route
//with wrong authorization tocken
Route::middleware('auth:api')->group(function () {
    Route::get('user', 'UserController@show');
});
Route::post('user', 'UserController@store');
Route::put('user/{id}', 'UserController@update');
Route::delete('user/{id}', 'UserController@destroy');

/UserController.php

public function show()
{

    if(Auth::check()){
        $user = auth()->user();
        return response()->json(['user'=>auth()->user()], 200);        
    }else{
        return response()->json("can't connect", 400);
    }

}

第一个片段 公共函数显示() {

    try {
        $user = auth()->user();
    } catch (\Throwable $th) {
        return response()->json("can't connect", 400);
    }

    return response()->json(['user'=>auth()->user()], 200);

}

第二个片段 /app/exceptions/handler.php

public function render($request, Exception $exception)
{
    if ($exception instanceof TokenMismatchException) {
        return "Token error";
    }

    return parent::render($request, $exception);
}

第三个片段

\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php

protected function unauthenticated($request, AuthenticationException $exception)
{
    return $request->expectsJson()
                ? response()->json(['message' => $exception->getMessage()], 401)
                : redirect()->guest($exception->redirectTo() ?? route('login'));
}

错误片段(可能有用)

public function route($name, $parameters = [], $absolute = true)
{
    if (! is_null($route = $this->routes->getByName($name))) {
        return $this->toRoute($route, $parameters, $absolute);
    }

    // the following line is highlighted 
    throw new InvalidArgumentException("Route [{$name}] not defined.");
}

我希望返回的是 json 而不是这个错误模板

因为你可能发现我正在尝试构建一个宁静的 API

【问题讨论】:

    标签: php laravel token laravel-passport


    【解决方案1】:

    您可以创建自定义错误,并在渲染方法中添加标准响应,您可以返回您想要的 json。

    例如新建一个异常App/Exceptions/CustomInvalidTokenException.php

    <?php
    
    namespace App\Exceptions;
    
    use Exception;
    use Illuminate\Http\Request;
    
    class CustomInvalidTokenException extends Exception
    {
        /**
         * Render the exception into an HTTP response.
         *
         * @param  \Illuminate\Http\Request
         * @return \Illuminate\Http\Response
         */
        public function render(Request $request)
        {
            return response()->json([
                'error' => $this->getMessage(),
                'status' => 0
            ], 500);
        }
    }
    

    然后在你的控制器中抛出它,它会在内部为你呈现异常响应:

    <?php 
    
    
    try{
        // something
    }
    catch(TokenMismatchException $e){
    
        throw new CustomInvalidTokenException('Invalid token found');
    }
    

    如果你想在全局上处理异常而不是在特定路由上,那么你可以在 handler.php 中执行throw new CustomInvalidTokenException

    【讨论】:

    • 我知道如何进行自定义异常......但不是这样,我有邮递员并推动标题 Authorization : Bearer 。 $token 并且它正在工作,当我发送错误的令牌时它给我这个错误它甚至没有在 show 方法中运行一行
    • 哦,明白了,你能检查一下这是否有帮助:stackoverflow.com/questions/29115184/…。如果处理程序中的条件,似乎它不会进入内部。你能做 dd($exception) 并查看你得到的异常类吗?
    • 目前无法处理此请求。 HTTP 错误 500
    • 目前无法处理此请求。 HTTP 错误 500
    • 你在 laravel 日志中遇到什么错误?还是错误 500?
    猜你喜欢
    • 2016-05-30
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2020-12-18
    • 2011-06-12
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多