Я использую следующий код для запроса токена от IdentityServer, который использует протокол OpenID:
$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;
Выводит следующую ошибку:
$auth = {"ErrorMessage":"Unsupported Mediatype"}
Может ли кто-нибудь помочь в этом?
Вы должны предоставить HTTP-заголовок Content-Type, который принимает принимаемый вами ресурс, добавив что-то вроде этого:
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
Это сделает его JSON (в качестве примера!), А ваши выходные данные (CURLOPT_POSTFIELDS) должны соответствовать выбранному вами типу контента.
В настоящее время Content-Type является «multipart / form-data», согласно PHP документация:
Если значение является массивом, заголовок Content-Type будет установлен в multipart / form-data.
Если вы хотите использовать Content-Type «application / x-www-form-urlencoded», то в дополнение к настройке этого типа Content-Type вы должны также указать CURLOPT_POSTFIELDS в этом формате. Будучи языком веб-разработки, PHP имеет встроенную функцию http_build_query
для кодирования массивов в этом формате:
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query(array(
'redirect_uri' => $redirect_uri,
'grant_type' => 'authorization_code'
)));
Других решений пока нет …