在端点接收无效凭据

问题描述 投票:0回答:1

我正在 Postman 中开发 Webhook API。

在 Postman 中,我在标题中输入了用户名、密码和帐户代码。 然后,我将以下有效负载直接发送到网站的端点:

{
  "email": "[email protected]",
  "overwrite": true,
  "fields": {
    "first_name": "John",
    "last_name": "Doe",
    "country": "Chile",
    "mrc_c3": "300.00",
    "mrc_date_c3": "10/16/24"
  }
}    

使用上述内容,我得到 200 OK 响应。

我可以登录网站并查看更新。

当我尝试将相同的有效负载发送到 PHP 脚本端点时,出现问题。

在 PHP 端点中,我能够提取与上面相同的有效负载,并将每个参数设置为其自己的 PHP 变量。

在 PHP 脚本端点中,我手动设置用户名、密码和帐户代码。

回到 Postman,然后我仅将有效负载发送到 PHP 脚本端点。

我在 Postman 中收到 200 OK 响应,但在响应正文中,我回显了状态,并且收到 401 状态,这告诉我登录凭据不正确。

这是 PHP 脚本:

<?php
  $payload = json_decode(file_get_contents("php://input"), true);

  $email = mysqli_real_escape_string($db, $payload["email"] ?? '');
  $firstName = mysqli_real_escape_string($db, $payload['fields']['first_name'] ?? '');
  $lastName = mysqli_real_escape_string($db, $payload['fields']['last_name'] ?? '');
  $country = mysqli_real_escape_string($db, $payload['fields']['country'] ?? '');
  $mrc_c3 = mysqli_real_escape_string($db, $payload['fields']['mrc_c3'] ?? '');
  $mrc_date_c3 = mysqli_real_escape_string($db, $payload['fields']['mrc_date_c3'] ?? '');

  $url = "https://original.endpoint.com/";
  $xun = "USERNAME";
  $xpw = "PASSWORD";
  $xac = "ACCOUNT CODE";

  $content = '{
    "email": "' . $email . '",
    "overwrite": true,
    "fields": { 
            "first_name": "' . $firstName . '",
            "last_name": "'.$lastName.'",
            "country": "' . $country . '",
            "mrc_c3": "' . $mrc_c3 . '",
            "mrc_date_c3": "' . $mrc_date_c3 . '"
        }
   }';
  }';

$curl = curl_init( $url );
curl_setopt( $curl, CURLOPT_HEADER, false );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array(
     "Content-type: application/json",
    $xun,
    $xpw,
    $xac 
) );
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $content );
$json_response = curl_exec( $curl );
$status = curl_getinfo( $curl, CURLINFO_HTTP_CODE );

if ( $status != 200 && $status != 201 ) {
    error_log( "Error: call to URL $url failed with status $status, response $json_response, curl_error " . curl_error( $curl ) . ", curl_errno " . curl_errno( $curl ) );
}

echo "status: " . $status;  // <-- print the status in Postman

curl_close( $curl );

$response = json_decode( $json_response, true );
?>

让我重申一下,我从 Postman 本身收到了 200 OK 响应,但是当我从 PHP 脚本中打印出状态时,我收到了 401 响应。

屏幕截图供参考:

enter image description here

PHP 脚本中的凭据确实正确。 所以我不确定为什么我会收到 401 回复。

请帮忙。

php api postman webhooks http-status-code-401
1个回答
0
投票

好的,您面临的问题可能与在curl_setopt() 函数中传递凭据的方式有关。主要问题是:

在curl_setopt( $curl, CURLOPT_HTTPHEADER, array(...) ) 部分中,您直接传递$xun、$xpw 和$xac,但这不起作用。您需要将它们作为实际标头的一部分包含在内。

通常,用户名、密码和帐户代码等凭据要么以特定格式(如基本身份验证的授权标头)在标头中发送,要么作为请求正文的一部分发送。假设您想将它们作为标头传递,则应该显式设置标头。以下是如何修改脚本以正确添加凭据:

$curl = curl_init( $url );
curl_setopt( $curl, CURLOPT_HEADER, false );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array(
     "Content-Type: application/json",
     "Username: $xun",
     "Password: $xpw",
     "Account-Code: $xac" 
));
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $content );
$json_response = curl_exec( $curl );
$status = curl_getinfo( $curl, CURLINFO_HTTP_CODE );

if ( $status != 200 && $status != 201 ) {
    error_log( "Error: call to URL $url failed with status $status, response $json_response, curl_error " . curl_error( $curl ) . ", curl_errno " . curl_errno( $curl ) );
}

echo "status: " . $status;  // <-- print the status in Postman

curl_close( $curl );

$response = json_decode( $json_response, true );
© www.soinside.com 2019 - 2024. All rights reserved.