使用PHP cURL连接到OpenID显示错误

时间:2017-10-28 13:50:09

标签: php curl oauth openid identityserver3

我使用以下代码从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 个答案:

答案 0 :(得分:0)

您应该通过添加以下内容来提供您正在POST事物所接受的资源的Content-Type HTTP标头:

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

这将使它成为JSON(作为示例!),您的输出数据(CURLOPT_POSTFIELDS)必须与您选择的内容类型相对应。

目前,根据PHP documentation,内容类型是" multipart / form-data":

  

如果value是一个数组,Content-Type标题将设置为multipart / form-data。

如果您想使用Content-Type" application / x-www-form-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'
)));