我使用以下代码从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"}
有人可以指导吗?
答案 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'
)));