Laravel Passport - использование вашего собственного API с помощью Javascript 401 без проверки подлинности - PullRequest
1 голос
/ 07 июля 2019

Надеюсь, у тебя все хорошо.Уже несколько дней я борюсь с Laravel Passport, пытаясь использовать свой собственный API с помощью javascript / vuejs.Последние вечера читали почти все существующие посты о моей проблеме, но я не мог найти решения.Надеюсь, вы поможете мне, спасибо вам.

Я установил новое приложение laravel и установил Laravel Passport, как описано в этом официальном документе для Laravel 5.8 (https://laravel.com/docs/5.8/passport#introduction).Я делал каждый пункт из учебника несколько раз в разных приложениях, но безуспешно. Чтобы проверить мои настройки, я использую этот маленький запрос axios.

axios.get('/oauth/clients')
    .then(response => {
    console.log(response);
    }).catch(error => {
    console.log(response);
    })

Когда я вошел в систему, все работает нормально, когда я использую токен на предъявителя и использую почтальон для проверки '/ oauth / clients', это также хорошо работает, но когдаЯ не вошел в систему, он всегда возвращает 401 Unauthenticated.Моя цель - создать API-интерфейс, который я смогу использовать из своего собственного приложения в качестве пользователя, не прошедшего проверку подлинности, без токена на предъявителя, но не извне.Я думал, что Laravel Passport является правильным способом сделать это.

Мои заголовки запроса:

:authority: laravel.dev
:method: GET
:path: /oauth/clients
:scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
cache-control: no-cache
cookie: XSRF-TOKEN=eyJpdiI6IkxTTGs2cEtvbXc5cmhIZDhEV1lBXC9nPT0iLCJ2YWx1ZSI6IlpPcjdCbmlDcURraG03MndjUTVYeTV1WXl1YWx3MVdNWjFrZ1QrRENJcnlhZVVCNWtZdzl5VDN6ZjdkclBGK0siLCJtYWMiOiI3ZmQ4YjlkZmU3OWMyNjNiYWVhNzJhMWVkOGRhOGJhMzJkNWQwZmZjMDhmZDM2Y2IxYWRkODJiNzFhNmQ5NDA1In0%3D; laravel_session=eyJpdiI6IlpKc3EyS2R4NjAyM0t5XC8xaTR6SjJBPT0iLCJ2YWx1ZSI6Im1JRlRReVFHQ01jTlNQT3BkYlI1V0dNeE1BMkVvODhnWXNjM1VPRUFBRWRBRnl1N1diUmpOSkVJUmc0NTdsVFgiLCJtYWMiOiI0ZTZkNzE2OGQ5MzJkY2FmYzEzOWZiYjA3YTRiM2MxOGQ3OGJmNWIzMTI4ODA5MDMxYWVlMjJmOTk1M2FjZDdlIn0%3D
pragma: no-cache
referer: https://laravel.dev/
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
x-csrf-token: 4Opsva9oDk6LkAapLGqqh9AuPzWKfVH4PYoxcMB1
x-requested-with: XMLHttpRequest
x-xsrf-token: eyJpdiI6IkxTTGs2cEtvbXc5cmhIZDhEV1lBXC9nPT0iLCJ2YWx1ZSI6IlpPcjdCbmlDcURraG03MndjUTVYeTV1WXl1YWx3MVdNWjFrZ1QrRENJcnlhZVVCNWtZdzl5VDN6ZjdkclBGK0siLCJtYWMiOiI3ZmQ4YjlkZmU3OWMyNjNiYWVhNzJhMWVkOGRhOGJhMzJkNWQwZmZjMDhmZDM2Y2IxYWRkODJiNzFhNmQ5NDA1In0=

Заголовки ответа:

cache-control: no-cache, private
content-type: application/json
date: Sun, 07 Jul 2019 19:05:25 GMT
server: nginx/1.15.5
set-cookie: XSRF-TOKEN=eyJpdiI6IklTWEkrRTJxYXpiRFNQUm0zM3RLYWc9PSIsInZhbHVlIjoiMDEzSmVlMldQOXBrVUQxQjlCUGVVN2dpUk9VWmwrUlRjend3XC9CaUk1S2V6dUFlTDZtVWttREV5cVBPOFwveVQ0IiwibWFjIjoiZWZhMzA3OGVhYmY2NWNjNjgyMTg4NzAxZjQzNWYxZGQyMjVmMWY3MjAwNjllZTM5ODFiNjFiNWY1NGFjOGM0NiJ9; expires=Sun, 07-Jul-2019 21:05:25 GMT; Max-Age=7200; path=/
set-cookie: laravel_session=eyJpdiI6IlFLUDN0bGhBNW1UTytlbGgrcEZ0ekE9PSIsInZhbHVlIjoibHFvM09CSTFyZ05Kd0E0REVCekNOYmRocm01cnBVY3h1YjFOaXpyTXVcL05QSTNYdFFBdVpXZHd4NDVURGwralwvIiwibWFjIjoiYzM0ZWNhNzQ5MTJhY2VmNTZjZmM1YjFiNTgzYjU0NmZhZGIzZjVjYTFkOGNjYWEwNDEwODUyMzc5OWI2Njc3YiJ9; expires=Sun, 07-Jul-2019 21:05:25 GMT; Max-Age=7200; path=/; httponly
status: 401

Важное примечание : Я поделился проектом с моим другом, он работает на MacO с Laravel в док-контейнере, и авторизация работает на его устройстве без каких-либо изменений.Я бегу на машине с Windows Laravel Homestead.Может ли эта проблема быть вызвана Laravel Homestead или nginx?

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Маршрут «oauth / clients» определяется под префиксом «oauth» (например, / oauth / any-route) с использованием промежуточного программного обеспечения «web» и «auth». Это объясняет, почему вы получаете ошибку 401, когда вы не вошли в систему, так как промежуточное программное обеспечение 'auth' не работает.

/ продавец / Laravel / паспорт / ЦСИ / RouteRegistrar.php

 /**
 * Register the routes needed for managing clients.
 *
 * @return void
 */
public function forClients()
{
    $this->router->group(['middleware' => ['web', 'auth']], function ($router) {
        $router->get('/clients', [
            'uses' => 'ClientController@forUser',
            'as' => 'passport.clients.index',
        ]);

        ...
    });
}

Кроме того, вы не должны использовать промежуточное программное обеспечение "web" для своих маршрутов API. API не имеет состояния и не должен получать или отвечать никакими данными сеанса. Это означает, что нет необходимости в токенах CSRF / XSRF, которые, как я вижу, передаются в вашем примере.

Вам необходимо разместить маршруты API в указанном файле маршрутов API. Вы заметите, что промежуточное ПО авторизации 'auth: api' также немного отличается для маршрутов API.

/ маршруты / api.php

Route::middleware(['auth:api'])->group(function () {
    Route::get('/your/path', 'Api\YourController@index');
});

Тогда в Почтальоне просто передайте свой токен на предъявителя и ожидаемый тип ответа. И не забудьте добавить префикс 'api' к вашему маршруту, как вы это сделаете для всех маршрутов в файле маршрутов api.php.

/ api / your / path

Authorization   Bearer {your_token}
Accept          application/json

Надеюсь, это поможет и удачи!

0 голосов
/ 08 июля 2019

Спасибо за ваш ответ @matticustard.Я написал небольшой контроллер для проверки авторизации и поместил маршрут в следующую группу с помощью auth: api middleware:

Route::group(['prefix' => 'v1', 'middleware' => 'auth:api', 'namespace' => 'Api\v1', 'as' => 'api.'], function () {});

Когда я использую токен на предъявителя и почтальон, он работает нормально, но я хочуиспользовать этот маршрут также из моего приложения в качестве пользователя, который не вошел в систему. Но только из моего приложения, а не извне, как я могу добиться этого?

axios.get('/api/v1/test')
    .then(response => {
    console.log(response);
    }).catch(error => {
    console.log(response);
    })

Спасибо за ваше время:)

...