在 laravel 中将授权码转换为访问令牌不起作用
Posted
技术标签:
【中文标题】在 laravel 中将授权码转换为访问令牌不起作用【英文标题】:Converting Authorization Codes To Access Tokens in laravel not working 【发布时间】:2018-04-12 10:35:16 【问题描述】:我正在使用 laravel 护照来创建 oauth。
use Illuminate\Http\Request;
Route::get('/redirect', function ()
$query = http_build_query([
'client_id' => '3',
'redirect_uri' => 'http://127.0.0.1:8000/auth/callback',
'response_type' => 'code',
'scope' => '',
]);
return redirect('http://127.0.0.1:8000/oauth/authorize?'.$query);
);
Route::get('/auth/callback', function (Request $request)
$http = new \GuzzleHttp\Client;
$response = $http->post('http://127.0.0.1:8000/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => '3',
'client_secret' => 'client_secret',
'redirect_uri' => 'http://127.0.0.1:8000/auth/callback',
'code' => $request->code,
],
]);
return json_decode((string) $response->getBody(), true);
);
此处重定向授权成功,并且在使用 Guzzle 将授权代码转换为访问令牌时,页面会继续加载,而不会在此处返回任何响应。 即使在内部使用 CURL 也会返回 false。但是,在尝试从不同目的地的邮递员或 CURL 时,它会返回有效数据。是框架/包错误吗?
【问题讨论】:
试试dd($response->getBody())
,看看你会得到什么
什么都没有。它一直在加载和加载....
它可能会进入某种无限循环。检查日志
【参考方案1】:
不要使用 GuzzleHttp
使用此代码:
$request->request->add([
'username' => $request->email,
'password' => $request->password,
'grant_type' => 'password',
'client_id' => '2',
'client_secret' => 'GT6IA4aasdasdBhgrPvxHkGeXBasdasdST5F',
'scope' => ''
]);
$tokenRequest = Request::create(
url('oauth/token'),
'post'
);
$response = Route::dispatch($tokenRequest);
别忘了在顶部添加这个
use Illuminate\Support\Facades\Route;
【讨论】:
我正在使用 hyn 多租户,这解决了我的问题。 GuzzleHttp 不尊重 AuthServiceProvider > boot() > Passport::routes(null, ['middleware' => 'tenancy.enforce']) 中的 'tenancy.enforce' 中间件;【参考方案2】:您可能在 php 的集成 Web 服务器上运行您的代码。如果是,那么它将不起作用,因为它只能同时处理一个请求。所以,如果你从一个本地脚本向另一个本地脚本发出 HTTP 请求……那么你就会死锁。
尝试在本地运行 PHP-FPM。
【讨论】:
以上是关于在 laravel 中将授权码转换为访问令牌不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 通过 Passport 实现 API 请求认证:沙箱测试篇(私人访问令牌)
Laravel 通过 Passport 实现 API 请求认证:隐式授权令牌
Istio authservice oidc 无法交换访问令牌的授权码