2017-10-28 181 views
1

我使用以下代碼來請求來自一個IdentityServer,它使用OpenID協議令牌連接至OpenID:使用PHP捲曲顯示錯誤

$curl = curl_init('https://remoteserver.com/connect/token'); 
curl_setopt($curl, CURLOPT_POST, true); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$code = $_GET['code']; // The code from the previous request 
$redirect_uri = 'http://mycalldomain.com/test.php'; 

curl_setopt($curl, CURLOPT_POSTFIELDS, array(
    'redirect_uri' => $redirect_uri, 
    'grant_type' => 'authorization_code' 
)); 

curl_setopt($curl, CURLOPT_USERPWD, 
    "MYCLIENTID" . ":" . 
    "MYCLIENTSECRET"); 

$auth = curl_exec($curl); 
print '$auth = ';print_r($auth); // to see the error 
$secret = json_decode($auth); 
$access_key = $secret->access_token; 

是outputing以下錯誤:

$auth = {"ErrorMessage":"Unsupported Mediatype"} 

有人可以指導這個嗎?

回答

0

你應該提供一個Content-Type HTTP頭,你要發佈的東西資源接受,加入這樣的事情:

curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json")); 

這將使JSON(!作爲一個例子),和你的輸出數據(CURLOPT_POSTFIELDS)必須與您選擇的內容類型相對應。

目前,內容類型是 「多/表單數據」,按照該PHP documentation

If value is an array, the Content-Type header will be set to multipart/form-data.

如果你想使用的內容類型「應用程序/ x-WWW的形式,進行了urlencoded 「,那麼除了將其設置爲Content-Type之外,您還必須以該格式提供CURLOPT_POSTFIELDS。作爲一個Web開發語言,PHP具有這種格式的編碼陣列內置功能http_build_query

curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query(array(
    'redirect_uri' => $redirect_uri, 
    'grant_type' => 'authorization_code' 
))); 
+0

我已經設置了,但仍返回相同的錯誤。從進一步的調查,它似乎不應該在json中 - http://openid.net/specs/openid-connect-core-1_0.html#TokenRequest –

+0

你能幫我重新格式化我的代碼,不知道如何我可以發送以下類型:應用程序/ x-www-form-urlencoded –

+0

我編輯答案也有一個例子。通常,在執行POST時,應始終確保不僅僅是預期的Content-Type,而且還要確保POST數據的格式。許多庫將具有默認值,因此代碼中的格式可能不明顯如果沒有明確設置。 – Ilmari