【问题标题】:HTML5 CORS request fails in safari after redirect重定向后,Safari 浏览器中的 HTML5 CORS 请求失败
【发布时间】:2014-09-10 01:58:19
【问题描述】:

我正在使用 jQuery 制作 CORS 请求以完成 SSO 类型系统。用户登录 wordpress 的同时,还通过 hook 登录了 Moodle。

我遇到的问题是,在 Safari(并且只有 safari ~7+)中,当初始 POST 请求设置为 moodlesite.com/login/index.php 时,会重定向到:moodlesite.com/login/ index.php?testsession=user_id.

当此重定向发生时,Safari 会丢弃适用的 CORS 标头,然后对重定向 URL 的请求失败。

【问题讨论】:

    标签: jquery html wordpress cors moodle


    【解决方案1】:

    我发布这个问题只是为了回答它,因为我花了很长时间才找到解决这个 safari 错误的方法。希望这对某人有所帮助。

    我最终做的是创建另一个 ajax 请求,该请求在实际请求 Moodle 之前运行。此请求使用 wordpress 的 AJAX 功能将 CURL 生成到 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'); 
    

    【讨论】:

      猜你喜欢
      • 2015-11-26
      • 2017-02-14
      • 2023-03-03
      • 2015-05-09
      • 2014-10-19
      • 2013-02-12
      • 2016-07-26
      • 2015-03-09
      • 2014-08-22
      相关资源
      最近更新 更多