Laravel 5.6 Passport oAuth2 can't make request with Guzzle

断了今生、忘了曾经 提交于 2021-02-08 07:49:08

问题


I have a fresh project on Laravel 5.6, where I'm trying to study and understand API Auth with Passport. I'm trying to do that, and after that to make a Javascript application from where I'll access that API. So, API for first-party applications.

I've installed and registered all routes and setup specific to passport, and also installed Guzzle.

I looked for some tutorials and now I'm with that code :

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');
    }

}

It uses issueToken function from that Trait :

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);
    }

}

**NOW THE PROBLEM : ** Everything works perfect. I can register, I have an access token which works on protected with auth routes, and doesn't work when I give a wrong token. I read the documentation of Passport in Laravel 5.6 and all examples use GuzzleHttp to make requests inside controller method, and I have tried to rewrite my code using Guzzle instead of Request::dispatch.

So, I found in multiple sources, in documentation as well code with different but also same logic implementation, so my IssueTokenTrait now looks like :

<?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);
    }

}

And there is how my app gets broken. When I make a POST request to /api/register from POSTMAN now, it just not returns me a response, like please wait... and that's it. And if I restart my server, it returns me : [Mon Aug 20 11:29:16 2018] Failed to listen on 127.0.0.1:8000 (reason: Address already in use). So, it looks like it makes this request, but it not returns the response, or it goes in a infinite loop.

I get stuck for a day with that problem, and really it looks like some mystic here. Because all parameters and values are like it was with Route::dispatch, just the method of making this HTTP request changes.


回答1:


There are 2 options:

  1. Try to run another Artisan server process with different port (ex: 8001) and guzzle to it.
  2. Using personal access token instead, using createToken to generate access token.


来源:https://stackoverflow.com/questions/51927067/laravel-5-6-passport-oauth2-cant-make-request-with-guzzle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!