Laravel Vue SPA с использованием Sanctum response Unauthorized
Система Sanctum Auth на моем локальном компьютере работает хорошо, и у меня нет ошибок. Но в моем развернутом приложении возникают проблемы с авторизацией пользователя. Когда я вхожу в систему, он отправляет запрос на получение пользовательских данных, а затем перенаправляет. После завершения аутентификации вы будете перенаправлены, и приложение сделает запрос GET для получения дополнительных данных. Этот маршрут GET охраняется с помощью laravel sanctum. Но бэкэнд не регистрирует, что пользователь предпринял успешную попытку входа в систему, поэтому он отправляет ошибку 401 Unauthorized. Вот код...
Действие loadUser из store.js
actions: {
async loadUser({ commit, dispatch }) {
if (isLoggedIn()) {
try {
const user = (await Axios.get('/user')).data;
commit('setUser', user);
commit('setLoggedIn', true);
} catch (error) {
dispatch('logout');
}
}
},
}
Route Guard в routs.js проверяет isLoggedIn (локально это просто логическое хранилище)
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
// if (to.meta.requiresAuth) {
if (isLoggedIn()) {
next();
} else {
next({
name: 'home'
});
}
} else {
next();
}
})
Было указано, что я забыл настройку withCredetials для axios в bootstrap.js. Я сделал это дополнение, но проблема все еще остается.
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
window.axios.defaults.withCredentials = true;
Защита промежуточного программного обеспечения маршрутизации на стороне сервера (здесь запрос отклоняется)
Route::middleware('auth:sanctum')->group(function () {
Route::apiResource('trucks', 'Api\TruckController');
});
В файле конфигурации laravel cors.php я изменил "supports_credentials" с false
к true
'supports_credentials' => true,
Мне кажется, что информация о cookie не превышает вызов API (но я действительно не уверен). Эта настройка работает на моем локальном компьютере, но не на сервере, на котором я развернул.
1 ответ
Требуется добавить переменную среды в файл.env для SANCTUM_STATEFUL_DOMAINS
и сделал это равным доменному имени.
В конфигурационном файле laravel sanctum.php...
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1')),