Маршрут не найден после добавления промежуточного ПО ‘auth: api’ Laravel 5.3

#php #laravel-5 #oauth-2.0

#php #laravel-5 #oauth-2.0

Вопрос:

Я пытаюсь выполнить вызов api из одного из моих проектов laravel в другой, используя новую функцию oauth2 в laravel 5.3.

У меня есть этот маршрут в api.php файл маршрута моего нового проекта laravel, который я хочу вызвать из старого:

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

Без промежуточного программного обеспечения я могу вызвать его без проблем, с промежуточным программным обеспечением он выдает ошибку 404 not found.

Вот код, который извлекает токен доступа, а затем выполняет вызов api:

 $http = new GuzzleHttpClient;

$response = $http->post('http://my-oauth-project.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'client_credentials',
        'client_id' => 'client_id',
        'client_secret' => 'client_secret',
    ],
]);
$token = json_decode($response->getBody(), true)['access_token'];

$response = $http->get('http://my-oauth-project.com/api/hello', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.$token,
    ],
]);
return $response->getBody();
 

Ошибка, которая возвращается:

 [2016-10-14 09:46:14] local.ERROR: exception 'GuzzleHttpExceptionClientException' with message 'Client error: `GET http://my-oauth-project.com/api/hello` resulted in a `404 Not Found` response:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="robots" content="noindex,nofollow (truncated...)
 

Ответ №1:

Промежуточное программное обеспечение ‘auth: api’ автоматически перенаправляет запрос на страницу входа (которая в данном случае не существует, отсюда и ошибка 404).

Предоставление учетных данных клиента не требует входа в систему. Документация по нему еще не опубликована, но промежуточное программное обеспечение существует.

Чтобы использовать его, создайте новое промежуточное ПО под $routeMiddleware переменной appHttpKernel.php примерно так:

 protected $routeMiddleware = [
    'client_credentials' => LaravelPassportHttpMiddlewareCheckClientCredentials::class,
];
 

Затем добавьте это промежуточное программное обеспечение в конец маршрута:

 Route::get('/hello', function() {
    return 'hello';
})->middleware('client_credentials');
 

Это то, что сработало для меня.

Комментарии:

1. Я не могу себе представить, что промежуточное программное обеспечение, которое, как указано в документах, будет использоваться, сломается для чего-то, что широко освещается в документах (клиентские кредиты и предоставление паролей). Как бы то ни было, спасибо, что нашли это!