这是指其他用户在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是类似的。
有谁知道怎么做?