У меня ошибка выхода в стеке laravel 8 / jetstream / inertiajs

Я пытаюсь настроить выход из системы.

Я обнаружил много синтаксиса лезвий (вроде этого), но нет с vuejs. Поэтому я попытался воспроизвести результат синтаксиса лезвия, вставив ввод с токеном csrf в value и именем, установленным на _token. (переменная csrf содержит строку из файла cookie XSRF-TOKEN).

Когда я публикую, у меня в консоли появляется эта ошибка: POST http: // localhost: 3000 / logout 419 (неизвестный статус)

Вы можете сказать мне, в чем моя ошибка? Как мне правильно выйти из системы и перенаправить на выбранную мной страницу?

<form method="POST" :action="$route('logout')">
   <input type="hidden" name="_token" :value="csrf">
   <button type="submit">Logout</button>
</form>

person Flavien Laureau    schedule 07.01.2021    source источник


Ответы (2)


Я нашел решение.

Моя ошибка заключалась в восстановлении токена csrf, что было нехорошо. Я бы получил длинную строку, содержащуюся в файле cookie XSRF-TOKEN, в то время как мне нужно было получить токен из моего бэкэнда. Эти две струны совершенно разные по неизвестной мне причине.

Мне просто нужно было отправить токен csrf на мой интерфейс с помощью метода csrf_token ()

return Inertia::render('Dashboard', [
   'publications' => $publications,
   'users' => $users,
   'csrf_token' => csrf_token()
]);

Мне тоже не нужно было заполнять форму вручную

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

this.$inertia.post('/logout', {
    _token: this.$props.csrf_token
})

Эта ссылка мне помогла

person Flavien Laureau    schedule 08.01.2021

Думаю, есть способ лучше. Поделюсь с вами идеей.

О токене

Делить токен серверной частью клиентской части, как вы это делали, не обязательно.

О коде в компоненте Vue

Выход из системы не работал из-за вашей формы.

Ваша форма POST

<form method="POST" :action="$route('logout')">
   <input type="hidden" name="_token" :value="csrf">
   <button type="submit">Logout</button>
</form>

Лучший способ сформировать POST

<form @submit.prevent="logout()">
   <button as="button" type="submit">
        Logout
   </button>
</form>

Как видите, когда вы отправляете форму, она вызывает метод компонента vue, называемый logout. Метод:

export default{
    // Some code...
    
    methods:{
        logout() {
            this.$inertia.post(route('logout'));
        },
    }
}

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

Надеюсь, он будет вам полезен. Я также благодарю вас за то, что я нашел это решение только благодаря вашему ответу.

person Angelo Schuler Piletti    schedule 31.05.2021