Laravel 5.6通过oauth/token挂
Laravel 5.6 pass oauth/token hanging
我已经使用 Laravel Passport 安装设置了一个新的 laravel 5.6 安装。如果我用 Postman 向 http://127.0.0.1/oauth/token 发出 post 请求,我会得到一个有效的令牌:
请求
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....."
}
我不希望我的用户直接访问它,所以我在 routes/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的登录方法class:
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 获取令牌的请求时:
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"
}
请求刚刚挂起。它不会返回任何类型的响应或超时,它似乎永远加载。我不确定出了什么问题。如果我从 postman 向 oauth/token 发出 post 请求,它会工作,但是如果我向控制器方法发出 post 请求,控制器方法又会发出 post 请求 oauth/token,它不起作用。我没有得到任何回报。
我也尝试过从 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());
}
这是因为内置 PHP 服务器是 单线程 。因此,您对 OAuth 服务器的第二个(内部)请求正在杀死第一个请求。
看我的评论here。
我已经使用 Laravel Passport 安装设置了一个新的 laravel 5.6 安装。如果我用 Postman 向 http://127.0.0.1/oauth/token 发出 post 请求,我会得到一个有效的令牌:
请求
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....."
}
我不希望我的用户直接访问它,所以我在 routes/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的登录方法class:
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 获取令牌的请求时:
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"
}
请求刚刚挂起。它不会返回任何类型的响应或超时,它似乎永远加载。我不确定出了什么问题。如果我从 postman 向 oauth/token 发出 post 请求,它会工作,但是如果我向控制器方法发出 post 请求,控制器方法又会发出 post 请求 oauth/token,它不起作用。我没有得到任何回报。
我也尝试过从 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());
}
这是因为内置 PHP 服务器是 单线程 。因此,您对 OAuth 服务器的第二个(内部)请求正在杀死第一个请求。
看我的评论here。