Действия API Laravel, выполняемые из доменов, отличных от API

#laravel

#laravel

Вопрос:

Версия Laravel 8.19.0.

Я играю со свежей установкой Laravel, чтобы протестировать Sanctum, и я настроил несколько маршрутов в своем routes/api.php файл:

 Route::prefix('v1')->group(function() {
    Route::middleware('auth:sanctum')->get('/users', 'AppHttpControllersUsersController@index');
    Route::middleware('auth:sanctum')->get('/users/{id}', 'AppHttpControllersUsersController@fetch');
    Route::middleware('auth:sanctum')->put('/users/{user}', 'AppHttpControllersUsersController@update');
    Route::middleware('auth:sanctum')->delete('/users/{user}', 'AppHttpControllersUsersController@destroy');
});
 

Кроме того, я изменил RouteServiceProvider, чтобы эти маршруты api работали через поддомен «api»:

 public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::domain(env('API_DOMAIN'))
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });
    }
 

Из файла .env:

 API_DOMAIN=http://api.laravel-sanctum.com
 

Во время тестирования моих маршрутов я заметил, что могу получить доступ к действиям из своих маршрутов api, даже когда я пытаюсь выполнить их из веб-доменов (которые используют поддомен «test»).

Например: Laravel выполнит индексное действие в UsersController, когда я попытаюсь получить доступ к обоим api.laravel-sanctum.com/v1/users И test.laravel-sanctum.com/v1/users .

Может кто-нибудь просветить меня относительно того, почему это происходит и как я могу предотвратить test.laravel-sanctum.com/users URL-адрес для выполнения индексного действия в UsersController?

С удовольствием предоставлю любую дополнительную информацию, если потребуется.

Спасибо.

Ответ №1:

Оказывается, причина, по которой это происходило, заключалась в том, что env('API_DOMAIN') возвращал null в RouteServiceProvider, как я запускал php artisan config:cache в какой-то момент. При запуске php artisan config:clear переменная env правильно вернула домен api, и маршруты работали так, как предполагалось.

Для всех, кто еще просматривает это, стоит отметить, что с тех пор я также узнал, что Laravel рекомендует использовать переменные env только в файлах конфигурации и ссылаться на файлы конфигурации вне этого в вашем приложении. Т.Е. Рекомендуется использовать env('API_DOMAIN') в файле конфигурации и ссылаться на указанную переменную конфигурациивместо этого в RouteServiceProvider.