我正在用jQuery制作一个CORS请求来完成一个SSO类型的系统。用户同时登录到wordpress并使用钩子也登录到Moodle。
我遇到的问题是,在初始POST请求设置为moodlesite.com/login/index.php时,在Safari(并且只有safari~7 +)中有一个重定向到:moodlesite.com/登录/的index.php?testsession = USER_ID。
当发生此重定向时,Safari会删除适用的CORS标头,然后对重定向的URL的请求将失败。
答案 0 :(得分:1)
我发布这个问题只是为了回答它,因为我花了很长时间才找到这个safari bug的解决方法。希望这有助于某人。
我最终做的是创建另一个在moodle实际请求之前运行的ajax请求。此请求使用wordpress的AJAX功能将tomL制作成moodle服务器端。这允许我获取重定向的URL(包括用户的moodle id)。然后,在请求完成后,我向moodle服务器发出实际请求。
示例代码:
// redirect follower ajax request to figure out what the final moodle login url is
// this is necessary becuase SAFARI 7.03 looses CORS headers on ajax requests
add_action( 'wp_ajax_lms_redirect_follower', 'lms_redirect_follower' );
add_action( 'wp_ajax_nopriv_lms_redirect_follower', 'lms_redirect_follower' );
function lms_redirect_follower(){
$url = 'http://'.get_field('moodle_url', 'options').'/login/index.php';
$username = $_POST['username'];
$password = $_POST['password'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=".$username."&password=".$password);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$server_output = curl_exec ($ch);
$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
echo $url;
die();
}
function moodle_sso ()
{ ?>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
function crossDomainPost(user, pass) {
// first get the redirect url
var moodle_login_url = 'http://<?php the_field('moodle_url', 'options'); ?>/login/index.php';
var data = {
'action': 'lms_redirect_follower',
'username': user,
'password':pass
};
$.post("<?php echo admin_url( 'admin-ajax.php' ); ?>", data, function(response) {
moodle_login_url = response;
$.ajax({
type: 'POST',
url: moodle_login_url,
cache: false,
xhrFields: {
withCredentials: true
},
crossDomain: true,
data: {"username":user, "password":pass},
success: function(responseData, textStatus, jqXHR) {
$('#loginform').submit();
},
error: function (responseData, textStatus, errorThrown) {
// console.log(errorThrown);
// console.log(responseData);
},
complete: function(responseData, textStatus, errorThrown){
// console.log(errorThrown);
// console.log(responseData);
}
});
});
}
$(document).ready(function(){
$('#wp-submit').click(function(ev){
ev.preventDefault();
return crossDomainPost($('#user_login').val(), $('#user_pass').val());
})
})
</script>
<?php
}
add_action('login_footer', 'moodle_sso');