2016-07-06 156 views
1

我有一個簡單的curl請求,以PHP編寫的onelogin api。請求工作正常,從我的終端我的參數,我可以登錄我的用戶,但我在服務器上運行的PHP版本,生成訪問令牌,但當我嘗試任何GET或POST請求時,會出現401錯誤。我試過各種捲曲參數。一個html表單提交給lampp棧上的這個php頁面。似乎沒有工作。下面是一個簡單的GET請求的PHP腳本。真的很感激有這方面的幫助:onelogin api with php curl 401未授權

<?php 

//form will post these variables for post request 
//$username = $_POST['uname']; 
//$password = $_POST['pwd']; 

$data = array("grant_type" => "client_credentials"); 
$data_string = json_encode($data); 

$ch = curl_init('https://api.us.onelogin.com/auth/oauth2/token'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Authorization: client_id:XXX, client_secret:XXX", 
    "Content-Type: application/json") 
); 

//execute post 
$result = curl_exec($ch); 

if(!curl_exec($ch)){ 
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch)); 
} 

//parsse out bearer token and set header 
$json = json_decode($result, true); 
$a_token = $json['data'][0]['access_token']; 
$bearer_token = "Authorization: bearer: ". $a_token; 

curl_setopt($ch, CURLOPT_URL, "https://api.us.onelogin.com/api/1/users"); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array($bearer_token)); 

//execute 
$result2 = curl_exec($ch); 

if(!curl_exec($ch)){ 
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch)); 
} 

//close connection 
curl_close($ch); 

echo $result2; 

>

回答

0

我只是猜測這裏,但我最好的選擇是你沒有正確配置承載的令牌頭(OneLogin不喜歡之後的最終的空間「:」且將其解釋爲承載標記的一部分)

所以,你應該嘗試

$bearer_token = "Authorization: Bearer:". $a_token; // no space after Bearer: 
+0

嗨,約翰......謝謝......但那並沒有解決它! – skyfullofstars

+0

然後這是一個PHP編碼問題,我猜。 在這一點上,它看起來更像是一個編碼錯誤,而不是API的問題。 最好的選擇將是 一)檢查你要回來,只是爲了確保它被解析出正確 B)創建一個新的請求對象的第二請求例如承載令牌 $ ch2 = curl_init('https://api.us.onelogin.com/api/1/users'); 由於您正在重複使用第一個請求,它可能仍然被設置爲執行POST(第二個端點是GET),並可能與第一個請求中遺留的其他選項混雜在一起。更好地從一個乾淨的石板開始 –

+0

a)是的。嘗試過......被解析並正確發送到下一個函數。 b)創建新的請求對象$ ch2 .....注意這也失敗了我的POST請求!.......沒有工作! – skyfullofstars

0

鑑於我的第一個答案的失敗...

檢查你要回來,只是爲了確保它被解析出正確

創建一個新的請求對象的第二請求例如承載令牌

$ch2 = curl_init('api.us.onelogin.com/api/1/users'); 

curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, "GET"); 
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch2, CURLOPT_HTTPHEADER, array($bearer_token)); 

既然你打算重用的第一個請求,它可能仍然被設置爲做一個POST(即第2個端點是GET),並可能與從第一次請求遺留下來的其它選項混亂。

+0

試過..didnt工作.....請參閱上文! – skyfullofstars

+0

嘗試在用戶端點上執行GET操作 - 它不支持POST(除非它是修改用戶,在這種情況下語法不同,並且您必須使用允許讀取/寫入訪問的憑據) –

+0

請閱讀最初的帖子仔細!我提到GET和POST請求都不起作用。我有api憑證的管理用戶權限.....以及我的命令在終端上正常工作! – skyfullofstars

0

這會導致你的問題

if(!curl_exec($ch)){ 
    die('Error: "' . curl_error($ch) . '" - Code: ' . curl_errno($ch)); 
} 

您使用curl_exec兩次!