Laravel 5.6 Passport oAuth2 не может сделать запрос с помощью Guzzle

У меня есть свежий проект на Laravel 5.6, где я пытаюсь изучить и понять API Auth с помощью Passport. Я пытаюсь сделать это, а после этого создать приложение Javascript, откуда я буду обращаться к этому API. Итак, API для сторонних приложений.

Я установил и зарегистрировал все маршруты и настройки, относящиеся к паспорту, а также установил Guzzle.

Я искал несколько руководств, и теперь я с этим кодом:

RegisterController.php

<?php
namespace App\Http\Controllers\Api\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laravel\Passport\Client;
use App\User;

class RegisterController extends Controller
{
    use IssueTokenTrait;

    private $client;

    public function __construct(){
        $this->client = Client::find(1); //Client 1 is a Laravel Password Grant Client token from my DB (when I wrote php artisan passport:install
    }

    public function register(Request $request){
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|min:3',
            'password_confirmation' => 'required|same:password'
        ]);
        $user = User::create([
            'name' => request('name'),
            'email' => request('email'),
            'password' => bcrypt(request('password'))
        ]);
        return $this->issueToken($request, 'password');
    }

}

Он использует функцию issueToken из этой черты:

IssueTokenTrait.php

namespace App\Http\Controllers\Api\Auth;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use GuzzleHttp\Client;

trait IssueTokenTrait{

    public function issueToken(Request $request, $grantType, $scope = ""){
        $params = [
            'grant_type' => $grantType,
            'client_id' => $this->client->id,
            'client_secret' => $this->client->secret,           
            'scope' => $scope
        ];

        $params['username'] = $request->username ?: $request->email;

        $request->request->add($params);
        $proxy = Request::create('oauth/token', 'POST');
        return Route::dispatch($proxy);
    }

}

** ТЕПЕРЬ ПРОБЛЕМА: ** Все работает идеально. Я могу зарегистрироваться, у меня есть токен доступа, который работает на маршрутах, защищенных с помощью auth, и не работает, когда я даю неправильный токен. Я прочитал документацию Passport в Laravel 5.6, и все примеры используют GuzzleHttp для выполнения запросов внутри метода контроллера, и я попытался переписать свой код, используя Guzzle вместо Request::dispatch.

Итак, я нашел в нескольких источниках, в документации, а также код с другой, но такой же логической реализацией, поэтому мой IssueTokenTrait теперь выглядит так:

<?php 
namespace App\Http\Controllers\Api\Auth;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use GuzzleHttp\Client;

trait IssueTokenTrait{

    public function issueToken(Request $request, $grantType, $scope = ""){
        $params = [
            'grant_type' => $grantType,
            'client_id' => $this->client->id,
            'client_secret' => $this->client->secret,           
            'scope' => $scope
        ];

        $params['username'] = $request->username ?: $request->email;


        $url = url('/oauth/token');
        $headers = ['Accept' => 'application/json'];
        $http = new GuzzleHttp\Client;

        $response = $http->post($url, [
            'headers' => $headers,
            'form_params' => [
                'grant_type' => 'password',
                'client_id' => $this->client->id,
                'client_secret' => $this->client->secret,
                'username' => $request->email,
                'password' => $request->password
            ],
        ]);

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

}

И вот как ломается мое приложение. Когда я сейчас делаю запрос POST к /api/register из POSTMAN, он просто не возвращает мне ответ, как please wait... и все. И если я перезапущу свой сервер, он вернет мне: [Mon Aug 20 11:29:16 2018] Failed to listen on 127.0.0.1:8000 (reason: Address already in use). Итак, похоже, что он делает этот запрос, но не возвращает ответ или заходит в бесконечный цикл.

Я на день застрял с этой проблемой, и действительно, это похоже на какую-то мистику. Поскольку все параметры и значения такие же, как у Route::dispatch, изменяется только метод выполнения этого запроса HTTP.

Как вы запускаете свой сервер? На какой ОС вы работаете? Вы можете воспользоваться услугами камердинера? Что говорят журналы сервера, а как насчет журналов laravel?

Kyslik 20.08.2018 11:38

Работает в Linux Ubuntu 17.10. Я запускаю сервер с помощью php artisan serve. В журналах Laravel есть записи вроде class GuzzleHttp\Client not found. 'И когда это правда, он возвращает мне ту же ошибку в POSTMAN. Но когда я перехожу на «правильное» использование, это просто ломает сервер, и даже в браузере я не могу запустить сервер localhost:8000, потому что он просто работает как в бесконечном цикле, без отклика. Может у меня use не так он в моем Trait? ... Я пытаюсь всеми возможными способами, но все еще не решено ..

Iura Varzari 20.08.2018 12:11

Ты жрал composer require? Вы запускали composer dump-autoload или composer dump-autoload -o, если последнее работает, у вас есть опечатка в имени класса или имени файла, исправьте это.

Kyslik 20.08.2018 13:15

Нет, у меня возникла проблема с Guzzle, описанная в одной проблеме с GitHub. Похоже, когда вы пишете php artisan serve, это не то же самое, что вы используете некоторые виртуальные серверы. Я попросил друга попробовать его на WAMPP в Windows, и он отлично работает. Итак, проблема, похоже, в том, где вы запускаете свой сервер, и / или потому, что он использует vhost, но из php artisan serve я должен использовать localhost:8000.

Iura Varzari 20.08.2018 13:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
1 229
1

Ответы 1

Есть 2 варианта:

  1. Попробуйте запустить другой процесс сервера Artisan с другим портом (например, 8001) и жрать на него.
  2. Вместо этого используйте личный токен доступа, используя createToken для генерации токена доступа.

Другие вопросы по теме