【问题标题】:PHP Sessions from main and sub domains来自主域和子域的 PHP 会话
【发布时间】:2020-12-02 13:37:39
【问题描述】:

我在 PHP 中使用会话,我想知道您是否可以在使用 Ajax 时将会话从一个域传递到另一个域?

这是 domain.com 中的 index.html

domain.com 
index.html -> jQuery
$.post($url,$form.serialize(),function(e){console.log(e)});

这是 sub.domain.com 中的 index.php

sub.domain.com
json_encode<-index.php
==================== vvv INDEX.PHP PAGE vvv ======================
$session_options = array(
    'httponly' => true,
    'secure' => true,
    'domain' => 'domain.com'
);
session_set_cookie_params($session_options);
session_name( md5(sha1(md5($data))));
session_start();

switch ($_SERVER['HTTP_ORIGIN']){
    case 'www.domain.com':
            header('Access-Control-Allow-Origin: www.domain.com');
        break;
    case 'domain.com':
            header('Access-Control-Allow-Origin: domain.com');
        break;
}

header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
header('Content-Type: application/json');

如果我访问它,我可以在 sub.domain.com 中创建一个会话,如果我回到 domain.com,它会交叉。但是,当我从 domain.com 调用 sub.domain.com 时,它不会创建会话并将其传递给 domain.com。或者,我应该做 JWT 或 Bearer Token 之类的事情吗?

现在,我这样做的原因是身份验证,然后在身份验证之后,用户可以对其他应用程序功能进行其他调用。

因此,尽我最大的努力,我已将 ajax (sub.domain.com) 移至同一个域以进行调试/测试。当我使用来自同一域 (domain.com) 的 Ajax 进行调用时,它可以工作并在浏览器中设置 PHP 会话 cookie,而无需导航到 ajax 文件夹(例如物理打开页面)。它甚至可以毫无问题地跨域到子域。但是如果我把 ajax 放回子域,而不用物理打开页面,它就不会在 Ajax 调用上设置。

【问题讨论】:

  • @Twisty - 谢谢你的帖子。我对cookies和跨域有所了解。然而,这不是我的问题。我的问题是关于通过 Ajax 从主域调用它时未设置的 cookie。如果我实际访问页面 sub.domain.com 然后/或同时访问 domain.com,我可以跨域获取 cookie。 cookie 将显示在 domain.com 上。但是,当我通过 Ajax 调用帖子时,cookie 不会出现。但是,再次感谢您的有用帖子
  • 我想知道它是否与客户有关。当您在网络选项卡中查看有效负载时,您是否在响应中看到 Cookie?您还可以使用源动态创建 iFrame,作为建立 cookie 然后 POST 的 Touch 方法。
  • @Twisty,是的,我确实在网络跟踪中看到了 cookie,并且在浏览器网络中看到了它。
  • @Twisty - 我可以在 XHR 中看到 cookie,但是当我通过 javascript 调用 xhr 时,我什么也没看到。我正在使用以下内容:xhr.getResponseHeader('Set-Cookie')

标签: php jquery ajax session-cookies


【解决方案1】:

经过数小时的研究,然后对 Google.com 进行逆向工程,我发现 google 使用 Jsonp 数据类型。更改我的 ajax 请求的 dataType 后,我让它跨域工作。

$.ajax({
    type: "GET",
    url: 'URL_GOES_HERE',
    data: form.serialize(),
    success: function(data, status, xhr){
        console.log(data);
        console.log(status);
        console.log(xhr.getAllResponseHeaders());
    },
    dataType: 'jsonp'
});

现在,这样做的缺点有点严重。 jsonp 只能在 GET 中工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2012-06-25
    • 2011-07-11
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多