Есть ли в любом случае обработать ошибку несоответствия токена авторизации - PullRequest
0 голосов
/ 04 февраля 2019

Я новичок в laravel и laravel-passport, я следил за этой статьей на среде здесь

все идет так, как я хочу, пока я не попытался обработать ошибку, если пользовательотправил неверный токен авторизации в деталях метода

вот ошибка:

InvalidArgumentException

Маршрут [логин] не определен.

я использую laravel 5.7 и паспорт 7.1, который является самым последним

я пытался

первый фрагмент

  • , чтобы попытаться поймать ошибку в методе show

второй фрагмент

  • для обработки исключения несоответствия токена в /app/exceptions/handler.php это не исключение несоответствия токена, я думаю

третий фрагмент

  • даже немного упустить с ядром laravel в файле Handler.php

в методе без аутентификации, но без надежды

/ route / 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);
    }

}

Первый публичный показ функции Snippet () {

    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 голосов
/ 04 февраля 2019

Вы можете создать пользовательскую ошибку и в методе рендеринга добавить стандартный ответ, который вы можете вернуть желаемый 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');
}

Если вы хотите обрабатывать исключение глобально, а не по определенному маршруту, тогда вы можете сделать throw new CustomInvalidTokenException внутри handler.php

...