2

我的 Flask 应用程序的用户在https://example.com/login登录,但他们可以设置自定义域,如http://customdomain.com

我希望能够在用户访问他们的自定义域时访问 Flask 会话变量,以便在用户登录时我可以显示删除和修改用户界面控件。

当然,浏览器会阻止从创建它们的域以外的域访问 cookie。

关于如何解决这个问题的任何想法或方法?

4

1 回答 1

0

这就是我所做的;似乎运作良好。我使用withCredentialsset to对服务器进行 AJAX JSONP 调用true。服务器获取会话 cookie 并告诉客户端用户是否登录。根据响应,我可以向用户显示其他用户界面元素。

<script>

  $(".logged_in").hide();

  request = $.ajax({
    url: "http://example.com/ping/",
    type: "GET",
    dataType: "jsonp",
    xhrFields: {
      withCredentials: true
   }

});

request.done(function (response, textStatus, jqXHR){
    // log a message to the console

    if (response['logged_in'])
    {
      $(".logged_in").show();
    }
});

request.fail(function (jqXHR, textStatus, errorThrown){
  // log the error to the console
  console.error("The following error occurred: " + textStatus, errorThrown);
  console.log("jqXHR: " + JSON.stringify(jqXHR))
});

</script>

服务器代码:

def jsonp(func):
    """Wraps JSONified output for JSONP requests."""
    @wraps(func)
    def decorated_function(*args, **kwargs):
        callback = request.args.get('callback', False)
        if callback:
            data = str(func(*args, **kwargs).data)
            content = str(callback) + '(' + data + ')'
            mimetype = 'application/javascript'
            return current_app.response_class(content, mimetype=mimetype)
        else:
            return func(*args, **kwargs)
    return decorated_function


@app.route('/ping/')
@jsonp
def ping():

    if 'user_id' in session:
        print "session ping: %s" % session
        return jsonify(logged_in='true')

    else:
        print "session ping: not logged in"
        return jsonify(logged_in="false")
于 2013-10-31T14:42:39.297 回答