besogonskiy
@besogonskiy
работаю php laravel разработчиком.

Как отловить вход пользователя через токен (laravel passport)?

Нужно чтобы если пользователь заходит через токен, сохраненный в бразере тоже отловить его вход.
Использую laravel passport и доступ к бэкэнду через api.

Чтобы отловить момент входа пользователя через пароль достаточно использовать штатное событие Laravel Passport и добавить код

'Laravel\Passport\Events\AccessTokenCreated' => [
			'App\Listeners\onLogin,
		],
...


а если токен у пользователя уже сохранен в браузере как это отловить?

Как вариант создал отдельный middleware и передал его в

Passport::routes(null, ['middleware' => 'access_log']);


в AuthServiceProvider
но ничего не вышло. не заходит в мой middlewar.

а в файле роутов создавать общую группу с этим мидл варом для api не представляется удобным.
может есть какой универсальный способ?

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

Вот этот способ не помог. НЕ заходит в мидлваре:

3

Я провожу свой вечер, размышляя, как это сделать самому в Laravel 6.

Я создаю промежуточное программное обеспечение под названием AccessLogMiddleware
<?php

namespace App\Http\Middleware;

use App\AccessLog;
use App\User;
use Carbon\Carbon;
use Closure;
use Illuminate\Support\Facades\Hash;


class AccessLogMiddleware
{
    public function handle($request, Closure $next)
    {
        if ($request->route()->getName() === 'passport.token'){ //this the route name of the API endpoint to get the token
            $accessLog = new AccessLog([
                'username' => $request->username,
                'ip_address' => $request->getClientIp(),
                'login_time' => Carbon::now(),
            ]);

            $user = User::query()->where([
                'username' => $request->username,
            ])->first();

            if ($user) {
                $accessLog->is_valid_username = 1;
                if (Hash::check($request->password, $user->password)){
                    $accessLog->is_valid_password = 1;
                }
            };

            $accessLog->save();
        }
        return $next($request);
    }
}

Зарегистрировал его на Http\Kernel
protected $routeMiddleware = [
     'access_log' => \App\Http\Middleware\AccessLogMiddleware::class,
     ....
]

Примените промежуточное программное обеспечение к Passport::routes(), в моем случае оно находится вAuthServiceProvider:
Passport::routes(null, ['middleware' => 'access_log']);

Все готово!
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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