Larvel 5.4, Passport и Angular 7 плохо играют вместе - PullRequest
0 голосов
/ 01 января 2019

У меня есть сайт, который я построил с использованием Laravel 5.4, над которым я работаю над обновлением пользовательского интерфейса.Я хочу пойти в направлении одностраничного приложения, использующего Angular 7. Однако я застрял, пытаясь сделать запрос к моей конечной точке API, я продолжаю получать ошибку 401.Я следовал приведенным здесь инструкциям: https://laravel.com/docs/5.4/passport#consuming-your-api-with-javascript добавил метатег на страницу, произвел дополнительную настройку и начал использовать HTTP-библиотеку Angulars примерно так:

this.httpOptions = {
    headers: new HttpHeaders({
        'Content-Type':  'application/json',
        'X-Requested-With': 'XMLHttpRequest',
        'X-CSRF-TOKEN': this.meta.getTag('name=csrf-token').content
    })
};

this.http.get('api/v1/people', this.httpOptions).subscribe((data: any) => {console.log(data); });

, однако я продолжаю получать401 ошибка.Кроме того, здесь есть Kernel.php

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,       
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class
    ],

    'api' => [
        'throttle:60,1',
        'auth:api'
    ],
];

и Routes.php

Route::group(['middleware' => 'auth:api'], function(){
   Route::group(['prefix' => 'api/v1'], function () {
     Route::get('people', 'personController@apiIndex');
     Route::get('person/{id}', 'personController@apiGetPerson');
     Route::post('contactevent', 'contactEventsController@apiAddContactEvent');
   });
});

. Любой вклад приветствуется.

1 Ответ

0 голосов
/ 01 января 2019

Похоже, я неправильно понял часть предоставленной документации.Если вы хотите использовать свой API-интерфейс через JavaScript, который вы обслуживаете на своем сайте, вам не нужно включать свой маршрут в группу auth:api для аутентификации вызова.Laravel вместо этого передает cookie с вашим запросом, кроме того, CSRF не нужен, если это не запрос POST.Мое решение состояло в том, чтобы переместить мой маршрут в группу промежуточного программного обеспечения auth следующим образом:

Route::group(['middleware' => 'auth'], function () {
  Route::get('api/v1/people', 'personController@apiIndex');
}

и переписать мой угловой запрос HTTP следующим образом:

this.httpOptions = {
    headers: new HttpHeaders({
        'Content-Type':  'application/json'
    })
};

this.http.get('api/v1/people', this.httpOptions).subscribe((data: any) => {console.log(data); });

И все работало как ожидалось.

...