2016-09-04 132 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)

相關問題