У меня есть свежий проект на 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.
Работает в Linux Ubuntu 17.10. Я запускаю сервер с помощью php artisan serve. В журналах Laravel есть записи вроде class GuzzleHttp\Client not found. 'И когда это правда, он возвращает мне ту же ошибку в POSTMAN. Но когда я перехожу на «правильное» использование, это просто ломает сервер, и даже в браузере я не могу запустить сервер localhost:8000, потому что он просто работает как в бесконечном цикле, без отклика. Может у меня use не так он в моем Trait? ... Я пытаюсь всеми возможными способами, но все еще не решено ..
Ты жрал composer require? Вы запускали composer dump-autoload или composer dump-autoload -o, если последнее работает, у вас есть опечатка в имени класса или имени файла, исправьте это.
Нет, у меня возникла проблема с Guzzle, описанная в одной проблеме с GitHub. Похоже, когда вы пишете php artisan serve, это не то же самое, что вы используете некоторые виртуальные серверы. Я попросил друга попробовать его на WAMPP в Windows, и он отлично работает. Итак, проблема, похоже, в том, где вы запускаете свой сервер, и / или потому, что он использует vhost, но из php artisan serve я должен использовать localhost:8000.






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