Подключение к OpenID с использованием PHP cURL, показывающее ошибку

Я использую следующий код для запроса токена от 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"}

Может ли кто-нибудь помочь в этом?

1

Решение

Вы должны предоставить 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'
)));
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]