Паспорт Laravel: CreateFreshApiToken в приложении: ошибка авторизации - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь установить Laravel Passport на Laravel 5.7.18 с использованием PHP 7.2.13 .

Мое приложение используетAPI внутри себя с использованием JavaScript (Axios with Vue)

Я получаю 401 несанкционированную ошибку в веб-приложении JavaScript.Я прочитал документацию и добавил CreateFreshApiToken в веб-ядро.Файл cookie laravel_token фактически устанавливается сам.Однако oauth-таблицы в базе данных чистые.

Http / Kernel :

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

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

JavaScript :

axios.get("api/users/" + id).then(({ data }) => {
    this.user = data;
});

Auth.php :

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

        'api' => [
            'driver'   => 'passport',
            'provider' => 'users',
        ],
    ],

Маршруты (Api.php) :

Route::middleware('auth:api')->group(function () {
    Route::resource('users', 'UserController');
    Route::resource('groups', 'GroupController');
    // .. plus more resources
});

Axios Config:

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

var token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
  window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
  console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}

Заголовки в браузере, который возвращает 401: enter image description here

Рабочий запрос с почтальоном: enter image description here

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Если вы говорите, что ваши таблицы чисты в базе данных, попробуйте еще раз выполнить эту команду:

php artisan passport:install

Эта команда создаст ключи шифрования, необходимые для создания маркеров безопасного доступа.Кроме того, команда создаст клиентов «персональный доступ» и «предоставление пароля», которые будут использоваться для генерации токенов доступа:

Laravel 5.7 Документы на паспорт

0 голосов
/ 19 декабря 2018

Если вы используете имя пользователя и пароль для первоначального входа в систему, то предполагается, что вы создаете приложение First Party , которое имеет право на попытку входа пользователя / пароль.

Настоятельно рекомендуется, если вы создаете приложение Reactive с помощью Angular, React.js или Vue.js, тогда подход SPA (одностраничное приложение) даст гораздо более надежный продукт.

https://en.wikipedia.org/wiki/Single-page_application


Вы должны заметить, что с помощью этого конкретного метода, если ваше приложение делает статический (без запроса ajax) и, следовательно, перезагружается в браузере, вы потеряете токен аутентификации.В этом случае вы не используете хост для приложения, которое по определению является SPA, поэтому, если вам нужно сохранить токен между статическими перезагрузками запросов, вам нужно сохранить токен в cookie, я предлагаю использовать cookie, а неlocalStorage, поскольку доступность localStorage не гарантируется на 100% в вашем распоряжении во всех веб-браузерах.

Если ваше приложение находится в одном домене, вам не нужно использовать Passport.Вместо этого собственная аутентификация файлов cookie сеанса отлично подходит, все, что вам нужно сделать, это убедиться, что вы передаете токен CSRF для запросов на публикацию.


Для предоставления пользователю / паролю токена вы должны следовать этому руководству: https://laravel.com/docs/5.7/passport#password-grant-tokens

Из этого руководства, когда вы делаете успешный запрос на /oauth/token, возвращаемый токен должен быть установлен в вашем приложении как заголовок Authorization с токеном Bearer.

Ответ на запрос токена выглядит следующим образом:

{
    "token_type": "Bearer",
    "expires_in": 31536000,
    "access_token": "eyJ0eXAiOiJKVJhb...nheKL-fuTlM",
    "refresh_token": "def502008d6313e...94508f1cb"
}

Вы должны запросить и обработать этот объект JSON следующим образом:

axios.post('/oauth/token', {
    grant_type: "password",
    client_id: "1",
    client_secret: "zkI40Y.......KvPNH8",
    username:"email@address.com",
    password:"my-password"
}).then( response => {

    axios.defaults.headers.common['Authorization'] = `Bearer ${response.data.access_token}` 

} );

Значения для client_id (id)и client_secret взято из oauth_clients таблицы, там уже должна быть запись.

Если нет, тогда выполните php artisan passport:client --password

Незабудьте, что вам придется настроить некоторые заголовки, посмотрите на этот пост некоторую соответствующую информацию для заголовка Oauth Authorization : Как отправить заголовок авторизации с помощью axios

...