Laravel 5.6 pass oauth / Token Hang - PullRequest
0 голосов
/ 23 июня 2018

Я установил новую установку laravel 5.6 с установкой Laravel Passport.Если я отправлю почтовый запрос на http://127.0.0.1/oauth/token с почтальоном, я получу действительный токен:

Запрос

POST /oauth/token HTTP/1.1
Host: 127.0.0.1:8000
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Cache-Control: no-cache
Postman-Token: 99529c07-0fe3-38a8-54cf-8b80a9dd5fbd

{ 
    "grant_type" : "password",
    "client_id" : 4, 
    "client_secret" : "Ib1UOS7BK12tFxOilqwea1XGJhrExbVYe8B7r8wK",
    "username" : "mail@mail.com",
    "password" : "password"
}

Ответ:

{
    "token_type": "Bearer",
    "expires_in": 31536000,
    "access_token": "eyJ0eXAiOiJKV1.....",
    "refresh_token": "def5020026dfeb6f91f6a9....."
}

Iя не хочу, чтобы мои пользователи обращались к нему напрямую, поэтому я настроил маршрут в файле rout / web.php:

Route::post('login', 'API\AuthController@login');

Мой AuthController выглядит следующим образом:

<?php

namespace App\Http\Controllers\API;

use App\OAuth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller as Controller;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use App\User;

class AuthController extends Controller
{

public function __construct()
{
    $this->middleware('auth:api', ['except' => ['login']]);
}

/**
 * Login user and create token
 *
 * @param  [string] email
 * @param  [string] password
 * @param  [boolean] remember_me
 * @return [string] access_token
 * @return [string] token_type
 * @return [string] expires_at
 */
public function login(Request $request)
{

    $request->validate([
        'username' => 'required|string|email',
        'password' => 'required|string'
    ]);

    $credentials = request(['username', 'password']);

    return OAuth::login($credentials['username'], $credentials['password']);

}

Это вызываетметод входа в мой класс OAuth:

namespace App;

use GuzzleHttp;

class OAuth
{

public static function login($username, $password)
{
    $http = new GuzzleHttp\Client;

    $response = $http->post('http://127.0.0.1:8000/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => 4,
            'client_secret' => 'Ib1UOS7BK12tFxOilqwea1XGJhrExbVYe8B7r8wK',
            'username' => $username,
            'password' => $password
        ],
    ]);

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

}

Когда я использую Postman, отправляю почтовый запрос для получения токена:

POST /login HTTP/1.1
Host: 127.0.0.1:8000
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Cache-Control: no-cache
Postman-Token: 94469bd8-a011-7e04-5f20-b835a5b1cac4

{
    "username" : "mail@mail.com",
    "password" : "password"
}

Запрос просто зависает.Он не возвращается с каким-либо ответом или тайм-аутом, он просто загружается вечно.Я не уверен, что происходит не так.Если я отправляю почтовый запрос на oauth / token от почтальона, он работает, но если я делаю почтовый запрос к методу контроллера, который, в свою очередь, отправляет почтовый запрос на oauth / token, он не работает.Я ничего не верну.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Это потому, что встроенный PHP-сервер однопоточный . Следовательно, ваш второй (внутренний) запрос к серверу OAuth убивает первый.

Смотрите мой комментарий здесь .

0 голосов
/ 24 июня 2018

Я также попытался сгенерировать токен из curl или guzzle.попробуйте использовать этот код, он работает для меня.

function tokenRequest(Request $request){

  $request->request->add([
                "grant_type" => "password",
                "username" => $request->username,
                "password" => $request->password,
                "client_id"     => "2",
                "client_secret" => "VE5S97DfjNciEWJOL1gEZhVLEx2VAGJQEX1dK6cq",
        ]);

        $tokenRequest = $request->create(
                env('APP_URL').'/oauth/token',
                'post'
        );

        $instance = Route::dispatch($tokenRequest);

        return json_decode($instance->getContent());

}
...