无论如何,是否存在授权令牌不匹配错误

时间:2019-02-04 19:39:13

标签: php laravel token laravel-passport

我是laravel和laravel-passport的新手,我在中等here上关注了这篇文章

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

这是错误:

  

InvalidArgumentException

     

未定义路由[登录]。

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

我尝试过

第一个代码段

  • 尝试捕获show方法中的错误

第二个片段

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

第三段

  • 甚至在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);
    }

}
  

第一段       公共功能show()       {

    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

1 个答案:

答案 0 :(得分:1)

您可以创建一个自定义错误,并在render方法中添加标准响应,然后可以返回所需的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