与一些拥有 API 调用的 WordPress 网站合作来完成各种任务,例如保存数据或发送事务消息。
我被告知我们的一个客户正在更新他们的端点,因此我们必须使用更新后的 URL 更新所有 API 调用。
更新 URL 端点后,我开始收到 403 响应。
在此更新之前我仅收到 200 条回复。
Postman 给了我 200 个带有更新 URL 的回复。
根据我们的客户,我们的调用似乎缺少
user-agent
,以前不需要,但现在显然需要,因为它触发了客户端的 Web 应用程序防火墙。
Postman 似乎自动包含
user-agent
,这就是它在那里工作的原因。
客户提供了
user-agent
外观的示例:
"User-Agent": "YourAppName/1.0"
我可以通过转到 Chrome 检查器、单击网络、单击请求,然后向下滚动标题来找到用户代理。
它的内容是这样的:
User-Agent: Mozilla/5.0 (Macintosh; Intel somestuff) AppleWebKit/somenumbers (KHTML, like Gecko) Chrome/morenumbers Safari/lastnumbers
这似乎很明显,但请告诉我这是否是正确的位置。
使用上面的用户代理,这是我尝试将其包含在我已经起作用的 API 调用中:
<?php
// transactional send
$userAgent = 'Mozilla/5.0 (Macintosh; Intel somestuff) AppleWebKit/somenumbers (KHTML, like Gecko) Chrome/morenumbers Safari/lastnumbers';
$url = "https://updated.api.net/" . $account . "/api/transactional/send";
$xun = "USERNAME: " . USERNAME;
$xpw = "PASSWORD: " . PASSWORD;
$xac = "ACCOUNT_CODE: " . ACCOUNT_CODE;
$xag = "USER-AGENT": " . $userAgent;
$content = '{
"message_id": 'someID',
"campaign_id": 'anotherID',
"recipients": ["'[email protected]'"],
"sending_connection_id": 'sendID'
}';
$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,
$xag
) );
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 "<script>alert('$status');</script>";
curl_close( $curl );
$response = json_decode( $json_response, true );
?>
使用上述内容,我可以将警报窗口打印到屏幕上。 这就是我收到 403 响应的地方。
请记住,当我将 URL 切换回原始 URL 时,我会收到 200 响应,并且可以看到该消息发送到我的电子邮件中。
我做错了什么以及如何解决?
听起来他们破坏了他们的 API,而不关心他们的客户。
User-Agent
请求标头是RFC9110 HTTP语义规范的一部分
10.1.5. User-Agent “User-Agent”头字段包含有关发起请求的用户代理的信息,通常由 服务器帮助确定报告的互操作性范围 问题,解决或定制响应以避免特定用户 代理限制,以及有关浏览器或操作的分析 系统使用。用户代理应该在每个中发送一个 User-Agent 头字段 请求,除非专门配置不这样做。
用户代理 = 产品 *( RWS ( 产品 / 评论 ) ) 用户代理 字段值由一个或多个产品标识符组成,每个标识符后跟 由零个或多个注释(第 5.6.5 节)共同确定 用户代理软件及其重要子产品。按照惯例, 产品标识符按其降序排列 对于识别用户代理软件具有重要意义。每个产品 标识符由名称和可选版本组成。
产品=代币[“/”产品版本] 产品版本= 令牌发送者应该将生成的产品标识符限制为 识别产品所必需的;发送者不得生成 产品内的广告或其他非必要信息 标识符。发送者不应该生成信息 产品版本不是版本标识符(即连续的 相同产品名称的版本应该仅在 产品标识符的产品版本部分)。
示例:
用户代理:CERN-LineMode/2.15 libwww/2.17b3 用户代理不应该 生成包含不必要的细粒度的 User-Agent 标头字段 细节并应限制第三方添加子产品。 过长且详细的 User-Agent 字段值增加请求 延迟以及用户在违背其意愿的情况下被识别的风险 (“指纹识别”)。
同样,鼓励实施不要使用产品代币 其他实现以声明与它们的兼容性, 因为这规避了该字段的目的。如果用户代理 伪装成不同的用户代理,接收者可以假设 用户有意希望看到为此量身定制的响应 已识别的用户代理,即使它们可能不适用于 实际使用的用户代理。
用户代理是用于进行 api 调用的机器/操作系统/应用程序。不建议重复使用 mozilla 浏览器用户代理字符串,因为它不能准确描述进行调用的客户端。