首页 > 解决方案 > 带有 PHP cURL 的 Nginx 401

问题描述

为了获得 oAuth2 令牌,我必须通过以下 URL 连接到 REST API:https://abcd/api/oauth/v1/token通过发送base64_encode(api_client_id:api_secret). 请注意,此外,访问https://abcd/api/oauth/v1/token受 htpwd 保护。

所以我用 PHP 编写的请求是:

$base64_encoded_client_id_and_secret = base64_encode('api_client_id:api_secret');
$curl_session = curl_init();
curl_setopt($curl_session, CURLOPT_URL, 'https://abcd/api/oauth/v1/token');
curl_setopt($curl_session, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Authorization: Basic ' . $base64_encoded_client_id_and_secret]);
curl_setopt($curl_session, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($curl_session, CURLOPT_USERPWD, "htpwd_user:htpwd_pwd");
curl_setopt($curl_session, CURLOPT_POST, true);
curl_setopt($curl_session, CURLOPT_POSTFIELDS, [
    'grant_type' => 'password',
    'username'  =>  'api_user',
    'password'  =>  'api_pwd'
    ]);
$ret = json_decode(curl_exec($curl_session));

但是 Nginx 服务器返回错误 401。我能做些什么来修复这个错误?

我测试了不同的值而不是CURLAUTH_DIGEST; 没有工作。

是 CROOS 起源问题吗?

标签: phpnginxcurloauth-2.0http-status-code-401

解决方案


即使有效,以下解决方案也不是一个好的解决方案(阅读以下内容)。通过在任意时间段内删除 htpasswd 安全步骤(等于我的测试和开发时间的总和)解决了这个问题。如果您这样做,请小心,因为 Google 可能会从属于该时间间隔的时刻开始索引该网站。

我没有尝试用@AngelDeykov 在评论中提出的逗号分隔字段值(不是在答案中)。


推荐阅读