Laravel 5.3:Passport实施 - {“error”:“invalid_client”,“message”:“客户端身份验证失败”}

时间:2016-09-04 10:10:46

标签: php oauth-2.0 laravel-5.3 laravel-passport

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

客户端/消费者项目中的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有非常基本的了解。)

如果有帮助,我正在尝试实施离线系统,该系统会在有互联网连接时定期向在线系统发送数据。所以我想我可以构建一个api并发送post请求,并提供要存储的信息。

2 个答案:

答案 0 :(得分:2)

问题是我在提到Redirect URL时提到的OAuth Client与我需要的不同。在本教程之后,我提到了http://api.xyz.com/callback 应该已经http://offline.xyz.com/callback

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

另外,请确保id表中的redirect字段和oauth-clients字段包含与/callback的路由说明中提到的值相同的值routes/web.php 1}}文件。

这应该可以解决错误。但是,它可能会引发另一个错误 - HttpFoundationFactory未找到。

composer.json中,使用require部分中的以下内容更新文件:

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

并运行composer update

你现在好了。

答案 1 :(得分:0)

您可能要重新安装Laravel项目或重新安装护照吗? 检查所有位置client_idclient_secret是否相同:“。env”文件,“oauth_clients”数据库表,以及代码部分:

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

如果它不同,则将“oauth_clients”数据库表中的client_idclient_secret复制并粘贴到适当参数的代码中(client_id,client_secret)。