Токен аутентификации Laravel 5.2 - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь реализовать аутентификацию на основе токенов в Laravel 5.2.Я сделал следующее:

Routes.php

Route::group([
    'middleware' => ['auth:api']
], function() {
    Route::get('/api/reservation', 'apiController@get');
});

Я изменил модель Пользователь и добавил api_tokenи добавил нового пользователя со случайной строкой через seeders:

Миграция

Schema::table('users', function (Blueprint $table) {
            $table->string('api_token', 60)->unique()->nullable()->default(null);
        });

Сеялка

User::create([
            ...,
            'api_token' =>  str_random(60),
        ]);

Контроллер

class apiController extends Controller
{
    function get(Request $request) {
        return Reserva::all();
    }
}

Затем, в Postman Я пытаюсь получить добавление URL /api/reservation?api_token=xxxxx с токеном, который есть в базе данных, но я всегда получаю Несанкционированное .Что-то странное, если я сделаю dd($this->auth) на промежуточном программном обеспечении аутентификации, я получу TokenGuard объект с name='web'.Разве это не должно быть api?

Может быть, я что-то неправильно понимаю, вы, ребята, можете дать мне подсказку?Спасибо

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

На случай, если кто-то еще столкнется с этой проблемой.Моя проблема была в промежуточном программном обеспечении Authenticate.У меня как-то была старая версия.

У меня было это Authenticate middleware:

class Authenticate
{
    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->auth->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('login');
            }
        }

        return $next($request);
    }
}

И я решил ее, изменив ее следующим образом:

class Authenticate
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return rediresct()->guest('login');
            }
        }

        return $next($request);
    }
}
0 голосов
/ 12 июня 2018

Промежуточное программное обеспечение auth:api, которое вы используете, использует Laravel Passport.Вы не можете использовать его, если вам нужна аутентификация на основе пользовательских токенов, как вы делаете это при создании своих собственных токенов.

Если вы хотите использовать Passport, сделайте следующее:

Сохраните ваши маршруты такими.Маршруты, требующие аутентификации, должны быть внутри промежуточного программного обеспечения auth:api.

Вы можете удалить поле api_token таблицы users.Функция $table->rememberToken() в миграции полностью отличается от того токена API, о котором вы думаете.На самом деле токены вообще не хранятся в базе данных.Токен, который вы видите в таблице oauth_access_token в базе данных, не является токеном, который вы используете для своих HTTP-запросов.

НЕ создавайте пользовательский токен, как вы.Убедитесь, что пара логин / пароль пользователя действительна, сгенерируйте токен и верните его потребителю API следующим образом:

if (Auth::attempt(['login' => $req->login, 'password' => $req->password])) {
    $user = Auth::user();
    $token = $user->createToken('ToutelaBreizh')->accessToken;
    return response()->json(['token' => $token],200);
}

Остерегайтесь размещать маршруты входа / регистрации за пределами auth:api промежуточное ПО, в противном случае вам нужно будет передать токен маршруту, который должен дать вам этот токен - это не имеет смысла.

Далее, убедитесь, что вы отправили токен в API в Authorizationзаголовок запроса, а не в параметрах запроса, как вы делаете.Добавьте в Postman следующий заголовок:

Authorization: Bearer your_token_retrieved_before

Теперь, когда вы почти закончили, вы можете использовать свой API с Postman.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...