Moodle接受从外部网站登录(Moodle 3.3.2)

时间:2017-11-15 07:19:09

标签: php authentication curl single-sign-on moodle

这是指其他用户在2013年使用相同主题(Moodle Accept Login from external site)的原始帖子,2014年也是类似的(Logging into Moodle via external site)。但是,我无法添加评论或回复这些帖子,我的Moodle版本不同(3.3.2),这就是我开始新线程的原因。希望有人可以帮助我。

当我们已经拥有现有网站并在稍后阶段为其LMS功能添加Moodle时,看起来这是一项非常常见的任务。 Moodle位于比web root低一级的文件夹中,因此没有跨域问题。

2013年的帖子说他设法通过使用PECL从头部复制cookie来解决这个问题,但是尝试了PECL但没有在我的服务器上工作,因此我用Google搜索了CURL方式。由于我的PHP知识不足,它也失败了。如果我使用HTML FORM发布到Moodle的login.php,那么它可以工作。 (所以我确定URL,用户名等都是正确的)

如果您有Moodle.org的帐户,也可以阅读我的问题。 (https://moodle.org/mod/forum/discuss.php?d=361390

<?php
$url = 'http://example.com/learning-center/login/index.php';
$fields = array(
    'username' => urlencode($_POST['myUsername']),
    'password' => urlencode($_POST['myPassword']));

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&';         }
rtrim($fields_string, '&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//execute post
$result = curl_exec($ch);


//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//enable headers
curl_setopt($ch, CURLOPT_HEADER, 1);
//get only headers
curl_setopt($ch, CURLOPT_NOBODY, 1);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

//////////////////////////////////////////////////////////////

$headers=array();

$data=explode("\n",$result);

$headers['status']=$data[0];

array_shift($data);

foreach($data as $part){
    $middle=explode(":",$part);
    $headers[trim($middle[0])] = trim($middle[1]);
}

foreach ($data->cookies as $name => $value) {
    setcookie($name, $value, $data->expires, $data->path, 'example.com');
}

?>

输出

This page should automatically redirect. If nothing is happening please use the continue link below.
http://example.com/learning-center/login/index.php

Array
(
    [status] => HTTP/1.1 200 OK
    [Date] => Wed, 15 Nov 2017 03
    [Server] => Apache/2.4.6 (CentOS) PHP/5.6.31
    [X-Powered-By] => PHP/5.6.31
    [Set-Cookie] => MoodleSession=bv77hhnn8f0vmbarkc9vujro25; path=/learning-center/
    [Expires] => 
    [Cache-Control] => private, pre-check=0, post-check=0, max-age=0, no-transform
    [Pragma] => no-cache
    [Content-Language] => en
    [Content-Script-Type] => text/javascript
    [Content-Style-Type] => text/css
    [X-UA-Compatible] => IE=edge
    [Accept-Ranges] => none
    [X-Frame-Options] => sameorigin
    [Content-Type] => text/html; charset=utf-8
    [] => 
)

它不完整,所以不要复制此代码并在生产中使用它。从标题看起来它会返回一个MoodleSession cookie,但是,如果我使用浏览器的Developer工具手动添加然后加载Moodle页面,Moodle仍然要求我记录。如果我手动登录Moodle,它设置的cookie是类似的。

有谁知道怎么做?

0 个答案:

没有答案