PHP - CURL连接到使用Office365登录的网站

时间:2016-11-04 16:22:15

标签: php curl single-sign-on office365

我需要帮助才能在使用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数据:

&#13;
&#13;
[
    {
        "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;
&#13;
&#13;

但我无法登录...所以很难继续我的项目...

我真的希望你能够帮助我。 如果您需要,请随时询问您想要的任何信息,因为英语不是我的母语。

提前谢谢, 最好的祝福。 的Yannick。

1 个答案:

答案 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处理。