Laravel 5.6 Passport OAuth Максимальное количество попыток входа в систему

Я только что создал простую систему OAuth с Laravel Passport. Эта система будет отвечать за регистрацию и аутентификацию пользователя внешнего приложения. Все работает так, как я ожидал, и теперь я хотел бы реализовать механизм блокировки пользователей после заранее определенного количества неудачных попыток входа в систему.

Я новичок в Laravel и Passport, есть ли какой-либо встроенный пакет, который может управлять этим для меня? Или мне нужно разработать эту функцию самостоятельно? Если да, то как я могу выполнить такую ​​задачу?

Я искал повсюду в сети, но до сих пор я не мог найти ничего относительно Passport OAuth.


person Ricky    schedule 12.04.2018    source источник


Ответы (2)


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

Создан пользовательский AuthController и метод входа в систему для замены oauth / токена по умолчанию в Laravel Passport:

use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;
use Illuminate\Http\Response;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Response;
use \Laravel\Passport\Http\Controllers\AccessTokenController as AccessTokenController;

class AuthController extends AccessTokenController
{
    use AuthenticatesUsers;

    //custom login method
    public function login(Request $request)
    {
        //...
    }
}

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

//custom login method
public function login(Request $request)
{
    //check if the max number of login attempts has been reached
    if ($this->hasTooManyLoginAttempts($request)) 
    {
        $this->fireLockoutEvent($request);

        return "To many attempts...";
    }

    //...
}

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

//check if user has reached the max number of login attempts

//verify user credentials
$credentials = $request->only('email', 'password');

if (Auth::attempt($credentials)) 
{       
    //reset failed login attemps
    $this->clearLoginAttempts($request);

    //...
}
else
{       
    //count user failed login attempts
    $this->incrementLoginAttempts($request);

    return "Login failed...";
}

И, наконец, поскольку Passport (OAuth2) использует запросы PSR-7 (интерфейс запроса сервера), нам нужно преобразовать стандартный запрос Laravel в PSR-7, чтобы выдать токен доступа:

//Authentication passed...

//convert Laravel Request (Symfony Request) to PSR-7
$psr7Factory = new DiactorosFactory();
$psrRequest = $psr7Factory->createRequest($request);

//generate access token
$tokenResponse = parent::issueToken($psrRequest);

//return issued token
return Response::json($tokenResponse);

Вот полный метод входа в систему:

public function login(Request $request)
{
    //check if user has reached the max number of login attempts
    if ($this->hasTooManyLoginAttempts($request)) 
    {
        $this->fireLockoutEvent($request);

        return "To many attempts...";
    }


    //verify user credentials
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) 
    {
        //Authentication passed...

        //reset failed login attemps
        $this->clearLoginAttempts($request);

        //convert Laravel Request (Symfony Request) to PSR-7
        $psr7Factory = new DiactorosFactory();
        $psrRequest = $psr7Factory->createRequest($request);

        //generate access token
        $tokenResponse = parent::issueToken($psrRequest);

        //return issued token
        return Response::json($tokenResponse);
    } 
    else 
    {
        //count user failed login attempts
        $this->incrementLoginAttempts($request);

        return "Login failed...";
    }
}
person Ricky    schedule 16.04.2018

На самом деле в laravel уже есть эта функция, вы можете проверить ссылку ниже об этом https://laravel.com/docs/5.6/authentication#login-throttling

person Amrit G.C    schedule 12.04.2018
comment
это для системы аутентификации Laravel по умолчанию. Я ищу аналогичную функцию для системы Laravel's Passport (OAuth). - person Ricky; 12.04.2018
comment
Паспорт Laravel расширяет аутентификацию по умолчанию, поэтому вы можете использовать тот же механизм для аутентификации паспорта. - person Amrit G.C; 13.04.2018
comment
Ok. Я собираюсь попробовать. Я дам отзыв, когда закончу. - person Ricky; 13.04.2018
comment
Пытался использовать регулировку входа в Laravel по умолчанию, но безуспешно. Я даже пробовал несколько неудачных попыток входа в систему, но Laravel не заблокировал ни одну из них. Как я могу этого добиться? - person Ricky; 13.04.2018