Как правильно в Laravel сделать авторизацию по токену для API?

Пытаюсь использовать из коробки имеющуюся авторизацию для API по токену. Процесс вроде бы изучил и частично реализовал. Настроил авторизацию по токену, на группу маршрутов повесил :
Route::group(['middleware' => ['auth:api']], function() {
// тут прописал все свои маршруты
});


Проблема в том, что если не передан токен или он некорректный, он не отдает код ошибка 401 или 404, он пытается сделать редирект на авторизацию (login), хотя какая авторизация или регистрация для API приложения.

Подскажите как правильно настроить что бы при отсутствии или не совпадения токена, просто отдавать 404 страницу или какие то свои данные?

И непонятно где переопределить название самой переменной, что бы была не "api_token"
  • Вопрос задан
  • 6989 просмотров
Решения вопроса 1
@mr_ko
Javascript, Node.js. React.js, Vue.js, Wordpress
Чтобы не изобретать велосипеды, можно использовать готовое решение Artem0071 https://github.com/tymondesigns/jwt-auth
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
ischerbin
@ischerbin
*nix админ увлекающийся программированием
Я в своем последнем проекте сделал просто. При обращении к API необходимо передавать token в заголовке, в поле X-Auth-Token. Реализация простая. Пишем middleware:
<?php

namespace App\Http\Middleware;

use App\AuthToken;
use Closure;

class TokenAuth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $_auth_token = $request->header('X-Auth-Token', null);

        if ($_auth_token)
        {
            $_token = AuthToken::find($_auth_token);
            if (!$_token)
                abort('401', 'No such token. Request a new one.');
        }
        else
            abort('401', 'No auth token provided');

        return $next($request);
    }
}

Потом в Kernel.php подключаем:
'token' => \App\Http\Middleware\TokenAuth::class,
И все работает. Получение токена сделано через POST запрос /api/token. Как это реализовать и затем хранить решайте сами.
Версия Laravel 5.4
Ответ написан
Комментировать
@Artem0071
Безработный mr. Junior
Тоже недавно начал изучение фреймворка и столкнулся с данной проблемой

В общем не знаю на сколько это грамотное решение, но вы можете перейти в app/Exceptions/Handler.php

Там как я понял идет перехват всех ошибок
При авторизации используется unauthenticated, так что можете сделать так:
/**
     * Convert an authentication exception into an unauthenticated response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Auth\AuthenticationException  $exception
     * @return \Illuminate\Http\Response
     */
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->is('api/*')) {
             // тут пишите что хотите вывести, например: 
             return response()->json(['error' => 'auth']);
        }

        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        return redirect()->guest(route('login'));
    }


Остальные ошибки можно в render() по той же схеме
У меня что то вроде этого получилось
if ($request->is('api/*')) {

            if ($exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
                return $this->setStatusCode(400)->renderOutput();

            if ($exception instanceof AuthorizationException)
                return $this->setStatusCode(403)->renderOutput();

            if ($exception instanceof ModelNotFoundException)
                return $this->setStatusCode(404)->renderOutput();

            if ($exception instanceof \Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException)
                return $this->setStatusCode(405)->renderOutput();

            if ($exception instanceof \Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException)
                return $this->setStatusCode(405)->renderOutput();

//            return $this->setData(['extension of' => get_class($exception)])->renderOutput();
        }
Ответ написан
@CrazyLostAngel
Логика этого поведения находится в \App\Http\Middleware\Authenticate:
protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login');
        }
    }


видимо в запросе к API вы не указывали что ожидаете JSON, поэтому он и перенаправляет на страницу логина.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы