PHP POSTMAN遵循授权标头含义

exdqitrt  于 2022-11-07  发布在  Postman
关注(0)|答案(1)|浏览(212)

我正在对需要OAuth 2.0授权的REST服务执行POST请求。
在Postman中,一切都运行得很好,因为启用了“Follow Authorization header”选项,所以auth header在重定向后会被保留。但是,我不知道PHP中CURL请求的该属性的等效属性。因此,我仍然得到以下错误:“会话已过期或无效”。
有没有人知道如何在PHP cURL中进行重定向后成功地保留auth头?
这是我的php代码:

$token = $this->getToken();
      $url = "XXX";

      $curl = curl_init();

      curl_setopt_array($curl, array(
      CURLOPT_URL => $url,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_POSTFIELDS => json_encode($data),
      CURLOPT_HTTPHEADER => array(
        'Authorization: Bearer ' . $token,
        'Content-Type: application/json'
      ,
      curl_setopt($curl, CURLOPT_POSTFIELDS, array(
        'client_id'     => 'XXX',
        'client_secret' => 'XXX',
        'username'      => 'XXX',
        'password'      => 'XXX',
        'grant_type'    => 'password',
        'redirect_uri'  => 'XXX'
      )))
    ));

    $response = curl_exec($curl);

    var_dump('TOKEN: ' . $token);
    var_dump($url);
    var_dump(curl_getinfo($curl));

    if (curl_errno($curl)) {
        var_dump('Error:' . curl_error($curl));
    } else {
        var_dump("SUCCESS! ");
        var_dump($response);
    }
sdnqo3pr

sdnqo3pr1#

您无法执行此操作:

curl_setopt($curl, CURLOPT_POSTFIELDS, array(
    'client_id'     => 'XXX',
    'client_secret' => 'XXX',
    'username'      => 'XXX',
    'password'      => 'XXX',
    'grant_type'    => 'password',
    'redirect_uri'  => 'XXX'

您已经执行此操作:Content-Type: application/x-www-form-urlencoded
如果您想保留Content-Type:应用程序/json。
当您为POSTFIELDS使用数组时,curl将使用Content-Type: application/x-www-form-urlencoded覆盖内容类型
我有时会将file_get_content()与上下文一起使用。
这是一个简单的方法(没有SSL),以获得标题和张贴数据的权利。
请记住,file_get_content()与curl有一些相同的特性。上下文有file_get_content(),它填充了Body。

<?php
header("Content-Type: text/plain,UTF-8");

$jsn = file_get_contents('json.jsn');
$postdata = http_build_query(
    array(
        'json' => $jsn,
    )
);
$opts = array('http' =>
  array(
    'method'  => 'PUT',
    'header'  => 'Content-type: application/json',
    'content' => $jsn  //useing JSON rather than $postdata
  )
);
$context = stream_context_create($opts);
$result = file_get_contents($url, false, $context);
echo $result;

相关问题