Laravel 5.6 Passport oAuth2无法通过Guzzle发出请求

时间:2018-08-20 08:44:16

标签: php laravel guzzle laravel-5.6 laravel-passport

我在Laravel 5.6上有一个新项目,我试图在此研究和了解Passport的API Auth。我正在尝试这样做,然后在要访问该API的地方创建一个Javascript应用程序。因此,第一方应用程序的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');
    }

}

它使用了来自该Trait的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而不是{{ 1}}。

因此,我在多个资源中找到了文档以及具有不同但逻辑实现相同的代码,因此我的 IssueTokenTrait 现在看起来像:

Request::dispatch

这是我的应用程序崩溃的原因。 现在,当我从<?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请求的方法就可以更改。

1 个答案:

答案 0 :(得分:0)

有2个选项:

  1. 尝试使用不同的端口(例如:8001)运行另一个Artisan服务器进程,并大吃一惊。
  2. 改为使用个人访问令牌,使用createToken生成访问令牌。