2016-09-04 134 views
2

我遵循Laracast : What's New in Laravel 5.3: Laravel Passport中提到的确切步骤,使用oauth2实现api authenticationLaravel 5.3:Passport Implementation - {“error”:“invalid_client”,“message”:“Client authentication failed”}

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请求以存储信息。

+0

你确定你的client_id是2吗?我没看教程,但通常oauth client_ids不是db中的自动增量值。 – engvrdr

+0

我也实现了'vue'组件在那里,我可以看到我的客户名单和他们的id,并且,我确信我有一个id = 2的客户。 –

回答

0

问题是我提到的Redirect URL,而我创建OAuth Client时是不同从我需要的。继教程之后,我曾提到http://api.xyz.com/callback其中应该是已经是http://offline.xyz.com/callback

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

此外,确保id场和redirect字段中oauth-clients表包含相同的值在routes/web.php文件中的路由描述提到/callback

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

composer.json,更新在require节以下文件:

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

和运行composer update

你现在很好走。

+1

您需要指定您的尝试的Grant Type克实施。此修补程序仅针对授权代码授权类型,并提示更多关于安装问题的具体信息。 –

0

可能是您重新安装Laravel项目或重新安装护照? 检查您的client_idclient_secret在所有地方都是一样的:“。ENV”文件,‘oauth_clients’数据库表,并在你的代码的一部分:

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

在情况下,如果它是一个不同的然后复制并粘贴client_idclient_secret‘oauth_clients’datatbase表,你适当的参数代码(client_id,client_secret)

相关问题