Laravel sanctum не проходит аутентефикацию

Composer.json:

    "require": {
        "ext-json": "*",
        "doctrine/dbal": "^2.12.1",
        "fideloper/proxy": "^4.4",
        "fruitcake/laravel-cors": "^2.0",
        "laravel/framework": "^8",
        "laravel/sanctum": "^2.9",
        "laravel/tinker": "^2.5",
        "spatie/laravel-permission": "^3.18"
    },

Kernel.php:

    protected $middlewareGroups = [
      'web' => [
        EncryptCookies::class,
        AddQueuedCookiesToResponse::class,
        StartSession::class,
        AuthenticateSession::class,
        // ShareErrorsFromSession::class,
        VerifyCsrfToken::class,
        SubstituteBindings::class,
      ],

      'api' => [
        EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        SubstituteBindings::class,
      ],
    ];

Cors.php:

return [
    'paths' => ['api/*, /login'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['*'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true,
];

sanctum.php:

    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', implode(',', [
      'localhost',
      'localhost:8000',
      'localhost:8080',
      'localhost:8002',
      '127.0.0.1:8002',
      '127.0.0.1:8080',
    ]))),

auth.php:

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],

RouteServiceProvider.php:

        Route::prefix('api/v1')
          ->middleware('auth:sanctum')
          ->group(function() {
              require_once base_path('routes/Api/V1/Auth/routes.php');
              require_once base_path('routes/Api/V1/Users/routes.php');
          });

Axios:

import Vue, { PluginObject } from 'vue';
import axios from 'axios';

const config = {};

const _axios = axios.create(config);

_axios.defaults.withCredentials = true;
_axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

_axios.interceptors.request.use(
  cfg => {
    return cfg;
  },
  err => {
    return Promise.reject(err);
  },
);

/**
 * Add a response interceptor
 */
_axios.interceptors.response.use(
  res => {
    return res;
  },
  err => {
    return Promise.reject(err);
  },
);

const Plugin: PluginObject<any> = {
  install: Vue => {
    Vue.$axios = _axios;
  },
};
Plugin.install = Vue => {
  Vue.$axios = _axios;
  window.axios = _axios;
  Object.defineProperties(Vue.prototype, {
    $axios: {
      get() {
        return _axios;
      },
    },
  });
};

Vue.use(Plugin);

export default Plugin;

введите сюда описание изображения

Логинюсь. Но любой запрос через auth:sanctum:

{message: "Unauthenticated."}

В чём может быть проблема?


Ответы (1 шт):

Автор решения: Не быть рабом на Руси

Ошибки

Ошибки было две:

  • не для всех роутов был прописан middleware('api');
  • Не корректно указаны middleware.

Решение

У меня роуты разделены в app/Providers/RouteServiceProvider.php, и для каждого роута я устанавливал middleware так:

Route::prefix('api/v1')
  ->middleware('api')
  ->middleware('auth:sanctum')
  ->group(function() {
    require_once base_path('routes/Api/V1/{some path}/routes.php');
    require_once base_path('routes/Api/V1/{some path}/routes.php');
  })

Что как оказалось не работает в laravel 8.

Корректно для меня заработало тогда, когда я передал массив middleware. Причём, важен порядок middleware в этом массиве.

Route::prefix('api/v1')
  ->middleware(['api', 'auth:sanctum'])
  ->group(function() {
    require_once base_path('routes/Api/V1/{some path}/routes.php');
  });

Route::prefix('api/v1')
  ->middleware(['api', 'auth:sanctum'])
  ->group(function() {
    require_once base_path('routes/Api/V1/{some path}/routes.php');
  });

Route::prefix('api/v1')
  ->middleware(['api', 'auth:sanctum'])
  ->group(function() {
    require_once base_path('routes/Api/V1/{some path}/routes.php');
    require_once base_path('routes/Api/V1/{some path}/routes.php');
  });
→ Ссылка