php - 如何使用 curl 和 php 进行网站授权?
问题描述
我正在尝试使用登录名和密码实现简单的授权。我得到一个 cookie,但不确定是否授权(如何检查?),我也在授权后尝试重定向,但结果,在我的代码尝试重定向后,我收到错误 404(followlocation,true)。
这是我的php代码
尝试重定向但发生 404。
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($curl);
echo $result;
curl_close($curl);
这里正在尝试授权,不确定它是否有效(但我得到 cookie 并且在标题中我得到 200 OK)
$loginData = [
urlencode('j_username') => 'someName',
urlencode('j_password') => 'somePassword'
];
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_VERBOSE, 2);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($loginData));
curl_setopt($curl, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/authCookie.txt');
curl_setopt($curl, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/authCookie.txt');
$result = curl_exec($curl);
echo $result;
curl_close($curl);
另外,我使用 urlencode 但不确定是否以正确的方式使用它(我在 curl 中使用它,例如 $curl --location --request POST ' http://someFullName ' \ --data-urlencode 'j_username=someUsername' \ --data-urlencode 'j_password=somePassword')
解决方案
对于身份验证,您可以使用 http 基本身份验证,它非常简单地用于客户端和服务器,在这种情况下,客户端代码将如下所示:
<?php
const COOKIE_FILE = '/tmp/authCookie';
$host = 'localhost';
$username = 'login';
$password = 'pass';
$ch = curl_init($host);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_USERPWD, sprintf('%s:%s', $username, $password));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE_FILE);
curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE_FILE);
$return = curl_exec($ch);
curl_close($ch);
关于您的 4xx 错误,我认为您的服务器有问题,对于测试重定向,您可以执行以下操作:
<?php
//stable route with redirect
$host = 'https://bitly.is/EnterpriseButton';
$userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:76.0) Gecko/20100101 Firefox/76.0';
$curl = curl_init($host);
curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $host);
//with enabled followlocation
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HEADER, true);
$result = curl_exec($curl);
curl_close($curl);
var_dump($result);
$curl = curl_init($host);
curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $host);
//with disabled followlocation
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($curl, CURLOPT_HEADER, true);
$result = curl_exec($curl);
curl_close($curl);
var_dump($result);
并且为了检查身份验证工作,您可以使用 curl 中的 cookie 通过浏览器进行身份验证
推荐阅读
- jquery - 使用日期选择器聚焦文本框后清除值
- r - 如何用 R 中另一个匹配的列名和行名的值填充数据框?
- java - 如何为新的警报对话框设置参数?
- google-analytics - 无法过滤用户资源管理器谷歌分析
- javascript - 2017-03-26 上的 Javascript 奇怪的日期行为。不能增加一天。为什么?
- python - 使 for 循环附加在所有数据集上
- python - 实时编译面部表情识别结果
- python-3.x - App Engine Launcher 是否仍然是 GCloud SDK 的 App Engine 的一部分?
- apache-servicemix - java.lang.IllegalArgumentException: Content-Type application/x-www-form-urlencoded 在使用多部分时无效,必须以“multipart/”开头
- csv - 我应该如何以及在哪里将 CSV 数据文件保存在 nuxt.js 项目中,以便可以在页面/模板上轻松呈现 CSV 数据?