在 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 无法交换访问令牌的授权码

Laravel 通过 Passport 实现 API 请求认证:第三方应用篇(授权码获取令牌)

如何在登录回调中使用授权码获取 UBER 访问令牌

无法在跨客户端谷歌 oauth2.0 中交换访问令牌和刷新令牌的授权码