不能使用Ajax登录rest式服务器


Can't make Ajax login to RESTful server

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

用户在subdomain.domain.com(也可以是otherdomain.com)插入他的登录名和密码后,我做了一个Jquery $。Post请求到rest.domain.com,用户得到正确登录。

然后,如果我再次请求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/ >";
        }
    }
});

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

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

你能提供更多关于如何存储会话的见解吗?

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

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

看这个线程:为什么jquery's .ajax()方法不发送我的会话cookie?

为了支持这种身份验证,您要么将REST api和Web站点放在同一域中,要么根据客户端和服务器之间交换的头(您可以控制的)定义会话身份验证。

例如,在执行初始身份验证之后,可以生成一个随机的会话id(不是PHP会话id)和下一个请求id,并通过HTTP头将其发送回客户端。

客户端将读取会话id和下一个请求id,并将其用于后续的REST api请求。

REST api将检查会话id和下一个请求id并对其进行验证。如果有效,则对请求进行身份验证。在响应中,将相同的会话id和新的下一个请求id发送回客户端。

为了避免第三方篡改会话,如果一个请求id被使用两次,会话id应该无效。

为了跨页面更改重用会话id,您可以将两者都存储在浏览器localStorage.

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

在我的案例中,软件设计允许我删除所有跨域请求并替换它们以使其工作。

如果不是这样的话,我认为最好的解决方案是依赖于OAuth,因为大多数"严肃的"RESTful api都是这样做的。