401 (Неавторизованный) при извлечении пользователя с использованием laravel Sanctum с аутентификацией токена API

Я просмотрел это руководство по аутентификации токена API с помощью laravel Santum. При входе в систему я получаю токен Bearer, который добавляю в заголовок axios. Но при попытке получить пользователя через /api/user я получаю 401. Обратите внимание, что я не использую токены CSRF, так как я использую Аутентификация Sanctum Api Token, а не аутентификация SPA.

У меня есть файл API для всех запросов axios, который выглядит как

let axiosInstance = axios.create({
  baseURL: 'http://some-url.local/api',
})

let api = function () {
  let token = localStorage.getItem('token');
  if (token) {
    axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`;
  }
  return axiosInstance;
}

export { api }

Некоторые функции авторизации

import {
  api
} from 'boot/axios'

export default {
  register(form){
    return api().post('/register', form)
  },
  login(form) {
    return api().post('/login', form)
  },
  logout(){
    return api().post('/logout')
  },
  auth(){
    return api().get('/user')
  }
}

ЛогинКонтроллер

class LoginController extends Controller{
  public function login(Request $request){
    $this->validate($request, [
        'email' => 'required|email',
        'password' => 'required',
        'deviceName' => 'required'
    ]);

    $user = User::where('email', $request->email)->first();

    if (!$user || !Hash::check($request->password, $user->password)) {
        throw ValidationException::withMessages([
            'email' => ['The provided credentials are incorrect.'],
        ]);
    }
    return $user->createToken($request->deviceName)->plainTextToken;
  }

  public function logout(Request $request)
  {
    $request->user()->tokens()->delete();

    return response()->json('logout successful', 201);
  }
}

Маршрут в route/api.php

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
  return $request->user();
});

Я использую HasApiTokens в своей пользовательской модели, имею «префикс» => «api» в config/sanctum.php, «пути» => ['api/*'] в config/cors.php и имею «api» => [ 'драйвер' => 'святилище',...] в моем config/auth.php

Я посмотрел этот урок дважды и скопировал все точно так же (за исключением того, что я использую фреймворк Quasar), обыскал весь google и stackoverflow... Я не понимаю, пожалуйста, помогите! Я получаю токен Bearer, поэтому приложение считает, что я вошел в систему, но не может получить свои пользовательские данные. В части 1 упомянутого выше руководства делается то же самое, но с аутентификацией SPA (csrf), и это действительно сработало!

ОБНОВИТЬ

Кажется, он работает с php artisan serve на http://127.0.0.1:8000/, но не с MAMP на http://some-domain.local или в общедоступном домене

Почему...


person Thomas Timmermans    schedule 23.10.2020    source источник


Ответы (2)


РЕШЕНО!

Для всех, кто столкнулся с этой проблемой: казалось, что мой токен Bearer по какой-то причине был удален из запроса на конечной точке laravel (я до сих пор не знаю почему).

Добавление пользовательского заголовка (X-Authorization) в axios и разрешение на стороне сервера с помощью промежуточного программного обеспечения исправили это! Подробнее здесь

person Thomas Timmermans    schedule 24.10.2020

Установите это в файле .env. В моем случае это порт 8000

SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8000
person Ihar Aliakseyenka    schedule 23.10.2020
comment
Кажется, это работает только при обслуживании с помощью команды php artisan serve. Не при использовании MAMP - person Thomas Timmermans; 24.10.2020
comment
Я проверил свой проект на laragon с доменом fl.test без запуска команды artisan, и все работает нормально. Я не могу сказать разницу между laragon и MAMP. Единственная разница, которую я вижу, заключается в том, что я не изменил драйвер API на «святилище», вместо этого я оставил «токен». - person Ihar Aliakseyenka; 24.10.2020
comment
Я установил драйвер API обратно на «токен», но это не имело значения. Кажется, я получаю авторизацию только тогда, когда фронт и бэкенд работают в одном и том же домене/поддомене. Не могу заставить его работать на разных доменах. (Та же проблема при размещении в открытом доступе) - person Thomas Timmermans; 24.10.2020