【问题标题】:PHP CURL error 403PHP CURL 错误 403
【发布时间】:2019-01-01 00:30:01
【问题描述】:

我正在尝试在 CURL 中获取一些数据。为此,我需要分两步进行:
- 获取我的令牌代码和自定义 url
-获取我需要的数据

我做的第一部分

$url = 'https://url.com/login';

$params = array( "KeyName" => "KeyValue");
$params = json_encode($params);
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $params);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

//recovery of token and URL
$response = curl_exec($ch);
$value = json_decode($response);
$value_token = $value->data->token;
$url = $value->data->url;

我可以毫无问题地获得这两个值,但是当我尝试下一步时,我会得到一个error 403。这是我的代码:

$params = array( "X-Session-Token" => "$value_token");
$params = json_encode($params);
$url = $url ."/api";

$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $params);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch , CURLINFO_HTTP_CODE);
echo $httpCode ."<- code http<br>";
if ($response === false) $response = curl_error($ch);
    echo stripslashes($response) ."<br>"; //return 1
curl_close($ch);
$val = json_decode($response);

我已经在命令提示符中成功完成了。 这是第二个请求的命令提示符:

curl "https://custom-url.com/api" \
-­H "Accept: application/json, text/*;q=0.2" \
­-H "Accept-­Charset: utf­8" \
­-H "Accept-­Encoding: gzip, deflate" \
­-H "Access-­Control­-Request-­Headers: x-­session-­token" \
­-H "X­-Session-­Token: MyToken" \
--­­compressed

更新
这是带有更新标头的请求:

$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Session-Token' => $value_token,'Access-Control-Request-Headers' => 'X-Session-Token', 'Accept' => 'application/json, text/*;q=0.2', 'Accept-Encoding' => 'gzip, deflate', 'Access-Control-Allow-Origin' =>'*'));
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

curl_exec($ch);

$info = curl_getinfo($ch);
print_r("<br>print : ". $info['request_header']);

print_r return : POST /api HTTP/1.1 Host: website.com Accept: / Content-Type: application/x-www-form-urlencoded Expect: 100-continue

【问题讨论】:

    标签: php curl


    【解决方案1】:

    如果我们在这里谈论会话令牌,那么每个 API 都会有不同的标准来接受令牌。 有些被编码为 Bearer 令牌,有些需要在 URL 中,有些需要 POST 变量。

    这听起来像是一个特殊标题的情况:

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'X-Session-Token' => $value_token
    ));
    

    或者,如果您想完全匹配命令行 CURL 请求:

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'X-Session-Token' => $value_token,
        'Access-­Control­-Request-­Headers' => 'X-Session-Token'
    ));
    

    【讨论】:

    • 我试图将这些参数放在标题中,但它一直给我同样的错误 403。
    • 更新完整代码。需要在上下文中查看它
    • $ch = curl_init( $adresse ); curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Session-Token' =&gt; $value_token,'Access­Control-Request­Headers' =&gt; 'X-Session-Token', 'Accept' =&gt; 'application/json, text/*;q=0.2', 'Accept-Encoding' =&gt; 'gzip, deflate', 'Access-Control-Allow-Origin' =&gt;'*')); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $response = curl_exec($ch);
    • 你有一堆错别字。 1. 是"$address" -> 你写对了吗? 2. 是“Access-Control-Request-headers”而不是“AccessControl-RequestHeaders”
    • 对不起,我在评论中写错了那些错别字,但它们在原始代码中是正确的。
    【解决方案2】:

    您是否尝试过添加请求标头? 尝试添加curl_setopt($ch, CURLOPT_HEADER, true); 看看是否有帮助。

    【讨论】:

    • 我得到:“HTTP/1.1 403 Forbidden Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Content-Type, X-Session-Token Content-Length: 0”
    • 尝试像这样添加 HTTPHEADER。 $header[] = "Content-type: application/json"; curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    • 它没有改变。第一个获取token和url的请求也在json中,不需要指定返回结果。
    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多