Laravel 5.4 401 / не прошел проверку подлинности с использованием паспорта и нескольких типов токенов

Предыстория этого, я работал над инструкциями из документации: https://laravel.com/docs/5.4/passport

я имею

  1. Laravel 5.4
  2. «laravel / passport»: «^ 3.0» от композитора
  3. Локальный Mac OSX под управлением Mamp Pro, Php 7.0.15

Я вызываю пример маршрута пользователя в маршрутах / api.php

Route::get('/user', function () {
return 'testing';
})->middleware('auth:api');

Заголовок скручиваемости почтальона (извлечен из экспорта кода в Почтальоне):

CURLOPT_HTTPHEADER => array(
"accept: application/json",
"authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImM3ZmI2ZmNmMWFkOGQ0NjFkNTdhMWU2NjFiYjhhOThmOTJhOTBkMDFkNDkwZDFjNDRkNDg5MTdlYjJiZWYyMDlkNjNmOTQwMjIxNTljZWI5In0.eyJhdWQiOiIxIiwianRpIjoiYzdmYjZmY2YxYWQ4ZDQ2MWQ1N2ExZTY2MWJiOGE5OGY5MmE5MGQwMWQ0OTBkMWM0NGQ0ODkxN2ViMmJlZjIwOWQ2M2Y5NDAyMjE1OWNlYjkiLCJpYXQiOjE1MDE3OTQ2NjIsIm5iZiI6MTUwMTc5NDY2MiwiZXhwIjoxNTMzMzMwNjYyLCJzdWIiOiIxIiwic2NvcGVzIjpbImFwaS1hY2Nlc3MiXX0.CPGM4PIKJBeiJvokuDzShz_1CnqHlnFIML-tWoBCn5GcijMXmQkWOHzTI8QwTws2h719TGA4hemXDljjqoZB0LiztAx2JZ3OhjNS-MhrMNujnTJUbvkXAVfcRdybhlDEWof_iboLICQTYNTslX1iw-2DCyFMh8gB4INAKUhpvzA955ALB-ZunKrjSNKdRkgtZRe0t6VyJf9LwzgjIAfSKoi_qRis36KD7hcf0Id_iWZkhvS-ZfuM5eUpzUooUe0rb4rkYYEYndlHlY7-uuZPlzmPMpaJTR4AW1CLkaK5Ic7fde1x1kk2duW_Znd9ki2YBP0kw7ifAmg2DaM5r2-0kEx_1iFuCIxE8QJns1aIm3XjWoOApovt7V6-s3yJZK3xlIDCjFI-C59RHiVSabh-hKdX4elvSL9taSQyuramPZPpsne9SUh4KCWul0iHoNjFdFJEut_TUBWyUPtD3J7gg6P97uRS_THDAUHMo2UYVhlnu9PV8SvbvjGj3OeaaH7ZbzWQCYKbqsLZAZ2mnJlFhTMghbaC2s_MND1zlRm7w9btmihxVW714NUbH8UAwSvrtIYYQ0itevZ59TLiAXprjmjkhiFkrhdX4bUje4uNEbLYawkZI-1o82IExW9D8kCYpOWOZdWTCLgmaE2wXcf-DTCV-9vDWRAdX1YmP4JbRsc",
"cache-control: no-cache",
"content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
"postman-token: 2ec7a2c8-3489-812d-4638-ebb7dc62aeb1"),

У меня есть 1 персональный токен доступа, сгенерированный с использованием Vue Components

Я проверил, что я устанавливаю срок действия токена на 1 год, и это отражено в БД.

Мой AuthServiceProvider.php

Passport::routes();

// TODO MAKE THEM LAST A LONG TIME
Passport::tokensExpireIn(Carbon::now()->addYears(20));//You can also use addDays(10)
Passport::refreshTokensExpireIn(Carbon::now()->addYears(20));//You can also use addDays(10)
Passport::pruneRevokedTokens(); //basic garbage collector

Passport::tokensCan([
'api-access' => 'Access Complete API',
]);

Мой RouteServiceProvider.php (mapApiRoutes вызывается в функции карты)

protected function mapApiRoutes()
{
Route::group([
'namespace' => $this->namespace,
'prefix' => 'api',
], function ($router) {
require base_path('routes/api.php');
});
}

Мое промежуточное ПО для маршрутизации Kernel.php

protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

— РЕДАКТИРОВАТЬ — ПОСЛЕ БОЛЬШЕ ИССЛЕДОВАНИЯ

Я использую почтальон, чтобы проверить мою аутентификацию API и получать 401 каждый раз, когда я пытаюсь. Я пробовал Персональный клиент доступа и Клиент предоставления пароля, и у обоих есть та же самая проблема. Посмотрев на них обоих, я понял, что оба используют формат Authorization Bearer [token].

Поэтому я начал выходить из системы в разных файлах в паспортном источнике.

В TokenGuard.php

public function user(Request $request) {

Log::info('TokenGuard: '. $request);

if ($request->bearerToken()) {
return $this->authenticateViaBearerToken($request);
} elseif ($request->cookie(Passport::cookie())) {
return $this->authenticateViaCookie($request);
}
}

Журнал выглядит так:

[2017-08-10 20:50:20] local.INFO: TokenGuard 93: GET /api/user HTTP/1.1
Accept:          application/json
Accept-Encoding: gzip, deflate
Cache-Control:   no-cache
Connection:      keep-alive
Content-Type:    application/json
Host:            url.com:8888
Postman-Token:   66707fe5-8f6e-4920-948b-2804a76d4a65
User-Agent:      PostmanRuntime/6.2.5[2017-08-10 20:50:20] local.INFO: TokenGuard 93: GET /api/user HTTP/1.1
Accept:          application/json
Accept-Encoding: gzip, deflate
Cache-Control:   no-cache
Connection:      keep-alive
Content-Type:    application/json
Host:            url.com:8888
Postman-Token:   66707fe5-8f6e-4920-948b-2804a76d4a65
User-Agent:      PostmanRuntime/6.2.5

Отсутствует только часть запроса в Bearer [token]. Блок кода TokenGuard выполняет if / else. Вот где я думаю, что провал происходит.

Разве это тоже не должно быть записано? Так как токен на предъявителя пропущен, If / Else терпит неудачу, и тогда имеет смысл вернуть 401.

Почему мой токен будет удален из запроса.

1

Решение

Добавьте это к вашему .htaccessфайл в публичном каталоге вашего проекта:

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]