2

我正在尝试使用 ajax 设置登录系统。

用户在 subdomain.domain.com(也可能是 otherdomain.com)中插入他的登录名和密码后,我向 rest.domain.com 发出 Jquery $.post 请求,并且用户正确登录。

然后,如果我向 rest.domain.com 发出另一个请求以检查用户是否已登录(或进行其他需要用户登录的操作),则会话为空。

我究竟做错了什么?

编辑

客户端应用

$.post('http://rest.domain.com/user/login',form,function(data){
   //Do what is needed
});

RESTful 应用程序(使用 Slim 和 uFlex)

header('Access-Control-Allow-Origin: *');
session_start();

//User
//Check if logged
$app->get('/user/logged', function () use ($user, $app){
    print_r($_SESSION);
    echo $user->signed;
});

//Login
$app->post('/user/login', function () use ($user, $app) {
    $username = isset($_POST['email']) ? $_POST['email'] : false;
    $password = isset($_POST['password']) ? $_POST['password'] : false;
    $auto = isset($_POST['auto']) ? $_POST['auto'] : false;

    $user->login($username,$password,$auto);

    if($user->signed){
        print_r($_SESSION);
    }else{
        //Display Errors
        foreach($user->error() as $err){
            echo "<b>Error:</b> {$err} <br/ >";
        }
    }
});
4

3 回答 3

2

我认为您违反了同源政策。您不能向不同的域发出 Ajax 请求,或者至少这是 SOP 规定的。所以这是你应该看的东西。

完成上述过程后,使用浏览器检查存储的 cookie。cookie 存储在每个子域的基础上,因此您的PHP_SESSIDcookie(如果您使用$_SESSION)可能存在于错误的子域中。

您能否提供有关如何存储会话的更多见解?

不管上述如何,最好将所有 Ajax 请求定向到ajax.php同一子域、协议等上的同一目标文件。(SOP 的所有规则)并在服务器级别路由请求。

于 2013-04-06T09:01:23.603 回答
0

您的会话可能存储在绑定到 rest.domain.com 的 cookie 中。

请参阅此线程: 为什么 jquery 的 .ajax() 方法不发送我的会话 cookie?

为了支持这种身份验证,您可以在同一个域中同时拥有 REST API 和网站,或者根据在客户端和服务器之间交换的标头(您可以控制)定义会话身份验证。

例如,在执行初始身份验证后,您可以生成一个随机 session-id(不是 PHP session-id)和 next-request-id 并通过 HTTP 标头将其发送回客户端。

在客户端,您将读取 session-id 和 next-request-id 并将其用于对 REST API 的后续请求。

REST API 将检查 session-id 和 next-request-id 并验证它。如果有效,则请求通过身份验证。在响应中,相同的 session-id 和一个新的 next-request-id 被发送回客户端。

为避免第 3 方篡改会话,如果请求 ID 被使用两次,则会话 ID 应失效。

为了在页面更改中重用 session-id,您可以将两者都存储在浏览器 localStorage 中。

于 2013-04-06T09:02:27.560 回答
0

尽管完全可以发出跨域 ajax 请求,但出于安全原因,这些请求并没有设置必要的 cookie 来保持有效会话。

就我而言,软件设计允许我删除所有跨域请求并替换它们以使其工作。

如果不是这样,我认为最好的解决方案是像大多数“严肃”的 RESTful api 那样依赖 OAuth。

于 2013-04-12T18:57:26.207 回答