Лучший способ аутентифицировать приложения SSR (Laravel) + VueJs? - PullRequest
0 голосов
/ 14 марта 2020

Я вижу много информации о том, как проходить аутентификацию для каждой технологии, и у меня есть опыт аутентификации для обоих случаев, когда мое приложение использует Laravel только для SSR (рендеринг на стороне сервера) и использует только Vuejs или Angular для CSR (Рендеринг на стороне клиента). Но я не вижу никакого контента о том, как защитить вместе URL с помощью Laravel + Vuejs (подход SSR), я выбираю этот подход как SSR, потому что мне понадобится хороший SEO на этом сайте, и я не хочу чтобы сделать этот SPA.

VueJs - это единственная структура из js, которую я могу работать вместе с технологией SSR, такой как Laravel (что я знаю).

Laravel уже есть подход аутентификации, но я использую подход API, потому что в моей системе будет мобильное приложение, поэтому мне нужна вся информация в одном месте, и проблема начинается здесь.

При обычном подходе мы просто делаем эта простая функция

public function authenticate(Request $request)
{
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        // Authentication passed...
        return redirect()->intended('dashboard');
    }
}

и Laravel уже введена в сеанс и подходит для go, а в одном приложении мы используем AccessTokens и RefreshTokens и т. д. c.

Но если мы будем использовать оба? Мне нужно будет сделать аутентификацию каким способом? Пример того, что я использую

        authService.logIn(this.user).then(response => {

            if(response.data.success === 1) {
                userService.updateObj(this.userModelOfi, response.data.user);
                authService.setAccessToken(response.data.token);
                utilService.showToast(this.$swal, 5000, 'success', response.data.message);
                $('#login_2').modal('hide').appendTo('body');
            } else {
                utilService.showToast(this.$swal, 5000, 'error', response.data.message);
            }
            this.loginRequest = false;

        }).catch(error => {
            this.loginRequest = false;
        });

Это моя функция входа в систему на Vue. JS, а эта функция authService.setAccessToken(response.data.token); хранит мой токен в Cook ie, потому что я хочу проверить, если токен аутентифицирован в моем SSR, поэтому, когда пользователь переходит на страницу пользователя для получения информации об изменениях, это защищенный маршрут, как я могу его защитить? Поэтому я делаю так:

public function handle($request, Closure $next) {

if (isset($_COOKIE['mpw_t'])) {
    $tokData = $_COOKIE['mpw_t'];
    $today = Carbon::now()->timestamp;
    $expirationDate = $this->decodedJwt($tokData)->exp;
    if ($today > $expirationDate) {
        $response = $this->refreshToken($tokData);
        if(isset($response->success)) {
            if($response->success === 0) {
                $this->cleanCookie('mpw_t');
                $this->cleanCookie('mpw_us');
                return redirect('/');
            } else {
                $this->cleanCookie('mpw_t');
                setcookie("mpw_t", $response->newTok, time()+60*60*24*30, '/');
                return $next($request);
            }
        }
    } else {
        return $next($request);
    }
}
$this->cleanCookie('mpw_t');
$this->cleanCookie('mpw_us');
return redirect('/');

}

Это пользовательское промежуточное ПО, которое регистрирует Laravel, если токен, который я выбрал у повара ie, действителен. Проблема в том, что я не знаю, является ли это правильным подходом, потому что я работаю над сайтом SSR, например, сайтом CSR, проверяющим токены для каждого защищенного маршрута, и в Vue. Js я тоже проверка подлинности с помощью токенов с обеих сторон.

Obs: в этой функции $response = $this->refreshToken($tokData); из промежуточного программного обеспечения я вызываю мой API внутри моего SSR с помощью GuzzleHttp .

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