我需要帮助才能在使用Office365 SSO(单点登录)的网站上使用PHP-CURL登录
过去,使用curl在PHP中使用用户名和密码登录是没有问题的:
<?php
$URL = "https://intra.epitech.eu/"
// if (!isset($argv[1]))
// die("Please specify the event URL");
$url_event = rtrim("https://intra.epitech.eu/module/2016/B-PAV-450/PAR-5-1/registered", "/");
$ch = curl_init();
$opts_base = array( CURLOPT_URL => $URL.'login',
CURLOPT_SSL_VERIFYPEER => FALSE,
CURLOPT_VERBOSE=> FALSE,
CURLOPT_COOKIEJAR => "cookie.txt",
CURLOPT_COOKIEFILE => "cookie.txt",
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HTTPHEADER => array('Content-Type: application/json', 'Connection: Keep-Alive')
);
curl_setopt_array($ch, $opts_base);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"login":"firstname.name@epitech.eu","password":"PASSWORD123"}');
$html = curl_exec($ch);
curl_setopt($ch, CURLOPT_POSTFIELDS, FALSE);
curl_setopt($ch, CURLOPT_POST, FALSE);
curl_setopt($ch, CURLOPT_URL, $url_event);
$html = curl_exec($ch);
var_dump($html);
// Some code...
?>
但最近Udate删除了帐户登录系统正在删除,现在它使用Office365 SSO身份验证&#34; Connect With Office&#34; :https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&client_id=e05d4149-1624-4627-a5ba-7472a39e43ab&redirect_uri=https%3A%2F%2Fintra.epitech.eu%2Fauth%2Foffice365&state=%2F
所以我的问题是:如何使用CURL连接到网站以提出请求?
我必须创建一个使用Office SSO连接登录的网站,然后使用该用户的信息使用该SSO Auth获取一些信息,例如用户等级& #34;管理员,学生等)并发出一些cURL POST请求来推送一些数据。
我绝对没有关于如何使用Office身份验证连接到Intranet的IDEA:/
如果auth正确完成,我应该有一些像这样的json数据:
[
{
"login": "user2.lastname@epitech.eu",
"picture": "https:\/\/cdn.local.epitech.eu\/userprofil\/blabla.jpg",
"title": "Firstname Lastname",
"location": "FR\/PAR",
"promo": 2019,
"course_code": "bachelor\/classic",
"grade": "-",
"cycle": "bachelor",
"date_ins": "2016-09-13 21:49:05",
"credits": 6,
"flags": [],
"semester": "B5"
},
{
"login": "otherguy.lastname",
"picture": "https:\/\/cdn.local.epitech.eu\/userprofil\/blabla.bmp",
"title": "Firstname LastName",
"location": "FR\/PAR",
"promo": 2019,
"course_code": "bachelor\/classic",
"grade": "-",
"cycle": "bachelor",
"date_ins": "2016-09-14 01:39:36",
"credits": 6,
"flags": [],
"semester": "B5"
},
{
...
}
]
&#13;
但我无法登录...所以很难继续我的项目...
我真的希望你能够帮助我。 如果您需要,请随时询问您想要的任何信息,因为英语不是我的母语。
提前谢谢, 最好的祝福。 的Yannick。答案 0 :(得分:1)
我没有使用Office SSO流程的经验,但(根据您的意见)可能您的问题是使用相同的cURL句柄来处理两个不同的请求。以下是一些建议。
尝试为每个请求创建一个句柄。
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL , $URL.'login');
curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER , FALSE);
curl_setopt($ch1, CURLOPT_COOKIEJAR , "cookie.txt"); it will save your cookies in the cookie.txt file after curl_close()
curl_setopt($ch1, CURLOPT_RETURNTRANSFER , TRUE);
curl_setopt($ch1, CURLOPT_HTTPHEADER , array('Content-Type: application/json', 'Connection: Keep-Alive'));
curl_setopt($ch2, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"login":"firstname.name@epitech.eu","password":"PASSWORD123"}');
$html = curl_exec($ch1);
curl_close($ch1);
看到我更喜欢curl_setopt对curl_setopt_array,但它只是个人偏好而且不应该影响你的脚本。
除非您已拥有文件cookie.txt
,否则行curl_setopt($ch1, CURLOPT_COOKIEFILE , "cookie.txt");
不是必需的。由于您使用CURLOPT_COOKIEJAR
,因此将在curl_close之后创建此文件。请参阅PHP manual中的这些选项的refence。
CURLOPT_COOKIEJAR:将句柄关闭时保存所有内部cookie的文件名,例如:在致电curl_close之后。
此外,这是调试代码的最佳步骤。尝试打印$html
并查看其内容,也许会给出一些提示。您还可以使用CURLOPT_VERBOSE
选项TRUE
来更精确地分析您的请求。
确保答案正确后,为第二个请求创建第二个句柄。
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_POSTFIELDS, FALSE);
curl_setopt($ch2, CURLOPT_POST, FALSE);
curl_setopt($ch2, CURLOPT_URL, $url_event);
curl_setopt($ch2, CURLOPT_COOKIEFILE , "cookie.txt");
$html2 = curl_exec($ch2);
curl_close($ch2);
var_dump($html2);
我认为这里是curl_setopt($ch2, CURLOPT_COOKIEFILE , "cookie.txt");
的正确位置,因为现在该文件存在。文档再次:
CURLOPT_COOKIEFILE:包含cookie数据的文件的名称。 cookie文件可以是Netscape格式,也可以是转储到文件中的普通HTTP样式的标头。如果名称为空字符串,则不会加载cookie,但仍会启用cookie处理。