Php Can';不要让Ajax登录到RESTful服务器

Php Can';不要让Ajax登录到RESTful服务器,php,javascript,jquery,ajax,session,Php,Javascript,Jquery,Ajax,Session,我正在尝试使用ajax设置登录系统 用户在subdomain.domain.com(也可以是otherdomain.com)中插入登录名和密码后,我向rest.domain.com发出Jquery$.post请求,用户就可以正确登录了 然后,如果我再次请求rest.domain.com检查用户是否已登录(或执行要求用户登录的其他操作),则会话为空 我做错了什么 编辑 客户端应用程序 $.post('http://rest.domain.com/user/login',form,function(

我正在尝试使用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:');
会话_start();
//使用者
//检查是否已记录
$app->get('/user/logged',函数()使用($user,$app){
打印(美元会话);
echo$user->signed;
});
//登录
$app->post('/user/login',函数()使用($user,$app){
$username=isset($\u POST['email'])?$\u POST['email']:false;
$password=isset($\u POST['password'])?$\u POST['password']:false;
$auto=isset($\u POST['auto'])?$\u POST['auto']:false;
$user->login($username、$password、$auto);
如果($user->signed){
打印(美元会话);
}否则{
//显示错误
foreach($user->error()作为$err){
echo“Error:{$err}
”; } } });
我认为您违反了同一原产地政策。您不能向不同的域发出Ajax请求,或者至少SOP规定了这一点。所以这是你应该看的

完成上述步骤后,使用浏览器检查存储的cookie。cookie是按每个子域存储的,因此您的
PHP\u sessiond
cookie(如果您使用的是
$\u SESSION
)可能存在于错误的子域中

您能否提供有关如何存储会话的更多信息


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

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

请参阅此线程:

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

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

在客户端,您将读取会话id和下一个请求id,并将其用于对RESTAPI的后续请求

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

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


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

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

在我的情况下,软件设计允许我删除所有跨域请求并替换它们以使其正常工作


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

是同一个web应用程序吗?你用的是什么服务器?web api?servicestack?您能否提供更多有关如何处理会话的详细信息?您是使用$\u Session[]还是保存到数据库?@Elger-事实上,我有两个web应用程序。服务器和客户端。它们是在标准的Linux共享环境中设置的。@CodePorter-我正在使用$\u会话处理会话。我使用uFlex进行身份验证。就像codeporter说的,那么你是如何处理会话的?如果超过1个应用程序,您需要将会话存储在数据库或其他地方。我使用CORS是为了不违反它,并确保我无法创建RESTful服务器。奇怪的是,根本没有存储会话cookie。服务器使用uFlex类将其存储在会话中。您可以通过在Web服务器中设置Header allow origin策略来允许这些跨域请求。在出现此问题之前,我就已经这么做了,因此我确信问题与此无关。
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/ >";
        }
    }
});