Получение клиентских учетных данных возвращает маркер 401 Несанкционированный - PullRequest
0 голосов
/ 17 апреля 2019

Я устанавливаю клиентский грант Laravel Passport и использую Guzzle для получения токена, но я получаю 401 несанкционированную ошибку.

Я создал клиента, используя: php artisan passport:client --client. Сгенерированный клиент:

Client ID: 1
Client secret: NmJsEVFClXVqWJuQnZTWA3bnZEVZ0KaC13anHZt1

Я сохранил их в своем файле .env и выполнил команду

php artisan config:clear

Вот мой код:

        $url = 'http://hub.local/oauth/token';

        $client_secret = env('CLIENT_SECRET');
        $client_id = env('CLIENT_ID');
        $client = new Client();

        try {
            $response = $client->post($url, [
                'json' => [
                    'grant_type' => 'client_credentials',
                    'client_id' => $client_id,
                    'client_secret' => $client_secret,
                ],
                'headers' => [
                    'Content-Type' => 'application/json',
                ],
            ]);
            return $response;
        } catch (RequestException $e) {
            dd($e);
        } catch (Exception $e) {
            dd($e);
        }

И полученное сообщение об ошибке:

ClientException {#660 ▼
  -request: Request {#649 ▶}
  -response: Response {#657 ▶}
  -handlerContext: []
  #message: """
    Client error: `POST http://hub.local/oauth/token` resulted in a `401 Unauthorized` response:
    {"error":"invalid_client","error_description":"Client authentication failed","message":"Client authentication failed"}
    """
  #code: 401
  #file: "C:\repos\client\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php"
  #line: 113

Когда я пытаюсь выполнить запрос, используя те же параметры и значения в Insomnia, запрос работает. Кажется, я пока не могу публиковать изображения. https://i.imgur.com/w6Ollin.jpg https://imgur.com/fXpzKjj.jpg

Я использую Laravel 5.8.12, Guzzle 6.3.3 и Passport 7.2.2. Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

в laravel doc есть пример, подобный этому:

Route::get('/callback', function (Request $request) {
    $http = new GuzzleHttp\Client;

    $response = $http->post('http://your-app.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'authorization_code',
            'client_id' => 'client-id',
            'client_secret' => 'client-secret',
            'redirect_uri' => 'http://example.com/callback',
            'code' => $request->code,
        ],
    ]);

    return json_decode((string) $response->getBody(), true);
});

когда я проверил это с моей информацией, я изменил что-то вроде этого:

Route::get('/users/login', function (Request $request) {
    $http = new GuzzleHttp\Client;

    $response = $http->post('http://payment.devenv/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => 2,
            'client_secret' => 'z8YWlJeaW0d7o7SFyPLISUxYOcO5CxjGrZ5YuItl',
            'username' => 'athamidn@gmail.com',
            'password' => '123456',
            'scope' => '',
            'code' => 200,
            'redirect_uri' => 'http://example.com/callback',
        ],
    ]);
    return json_decode((string) $response->getBody(), true);
});

И я получил ошибку то же самое с вашей ошибкой. Через много часов я получил вопрос:

В базе данных в таблице oauth_clients это моя информация:

2 name: Laravel Password Grant Client redirect: http://localhost

когда я изменил URL перенаправления на это, оно работает. наконец:

Route::get('/users/login', function (Request $request) {
    $http = new GuzzleHttp\Client;

    $response = $http->post('http://payment.devenv/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => 2,
            'client_secret' => 'z8YWlJeaW0d7o7SFyPLISUxYOcO5CxjGrZ5YuItl',
            'username' => 'athamidn@gmail.com',
            'password' => '123456',
            'scope' => '',
            'code' => 200,
            'redirect_uri' => 'http://localhost'
        ],
    ]);
    return json_decode((string) $response->getBody(), true);
});
0 голосов
/ 18 апреля 2019

Обновление: проблема возникала только тогда, когда я запускал (Laravel) клиентский и серверный экземпляры на одном и том же локальном сервере xampp.Я разделил их для запуска на их отдельных экземплярах xampp, и аутентификация работала без проблем.Что меня смутило при тестировании исключительно локально, так это то, что запрос работал с Insomnia, но не с браузером.Я предполагаю, что в части «машина-машина» этого клиентского гранта мой клиент + сервер использовал один и тот же экземпляр xampp как нечто нераспознанное.В любом случае, нет реальной проблемы.Надеюсь, это поможет кому-то еще.

...