Laravel 5.3:护照实施 - {"error":"invalid_client","message":"Client authentication failed"}

Laravel 5.3 : Passport Implementation - {"error":"invalid_client","message":"Client authentication failed"}

我按照 Laracast : What's New in Laravel 5.3: Laravel Passport 中提到的确切步骤使用 oauth2 实现 api authentication

我在 client/consumer 项目中的 web.php 文件如下所示:

use Illuminate\Http\Request;


Route::get('/', function () {
$query = http_build_query([
     'client_id' => 2,
     'redirect_uri' => 'http://offline.xyz.com/callback',
     'response_type' => 'code',
     'scope' => '',
    ]);

return redirect ('http://api.xyz.com/oauth/authorize?'.$query);
});

Route::get('/callback', function (Request $request){
$http= new GuzzleHttp\Client;

$response = $http->post('http://api.xyz.com/oauth/token',[
    'form_params' => [
            'grant_type' => 'authorization_code',
            'client_id' => 2 , 
            'client_secret' => 'tUGYrNeWCGAQt220n88CGoXVu7TRDyZ20fxAlFcL' ,
            'redirect_uri' => 'http://offline.xyz.com/callback',
            'code' => $request->code,
        ],
    ]);

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

我正在获取权限请求页面,我需要在其中 authorize 允许我的客户访问 api。但是,一旦我点击授权,我就会被重定向到显示以下消息的页面:

{"error":"invalid_client","message":"Client authentication failed"}

如何解决?

我没有在离线项目中安装laravel/passport。 我错过了什么吗?我已经遵循并实施了视频教程中提到的内容。我是否必须包含其他我不知道的内容? (我对 oauth2 有非常基本的了解)。

如果有帮助,我正在尝试实现一个离线系统,该系统会在有 Internet 连接时定期将数据发送到在线系统。所以我想我可以构建一个 api 并发送 post 请求,其中包含要存储的信息。

问题是我在创建 OAuth Client 时提到的 Redirect URL 与我需要的不同。按照教程,我提到了 http://api.xyz.com/callback 应该 http://offline.xyz.com/callback

如果您已经实施了 vue 组件,请为创建的 Oauth Client 使用 Edit 选项。适当更改重定向 URL。

此外,请确保 oauth-clients table 中的 id 字段和 redirect 字段包含与 [=21] 的路由描述中提到的相同的值=] 在你的 routes/web.php 文件中。

这应该可以修复错误。但是,它可能会引发另一个错误 - HttpFoundationFactory not found。

composer.json 中,在 require 部分更新文件:

"symfony/psr-http-message-bridge": "0.2"

和运行 composer update.

你现在可以走了。

可能是您要重新安装 Laravel 项目或重新安装通行证? 检查您的 client_idclient_secret 在所有地方是否相同:“.env”文件、"oauth_clients" 数据库 table,以及您的代码部分:

   'client_id' => ....,
   'client-secret' => ......

如果不同,则将 "oauth_clients" 数据库 table 中的 client_idclient_secret 复制并粘贴到您的代码中以获得适当的参数(client_id, client_secret).