Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Phalcon PHP中的会话持久性问题_Php_Angularjs_Phalcon - Fatal编程技术网

Phalcon PHP中的会话持久性问题

Phalcon PHP中的会话持久性问题,php,angularjs,phalcon,Php,Angularjs,Phalcon,我正在使用PhalconPHP,并试图实现一个身份验证服务。我的前端是一个AngularJS 5应用程序,它利用子域上的这个服务。(我的前端位于www.MyWebsite.com,我的服务位于service.MyWebsite.com)到目前为止,我已经实现了以下方法来启动会话 $di->setShared('session', function () { $session = new Session(); $session->start(); return

我正在使用PhalconPHP,并试图实现一个身份验证服务。我的前端是一个AngularJS 5应用程序,它利用子域上的这个服务。(我的前端位于www.MyWebsite.com,我的服务位于service.MyWebsite.com)到目前为止,我已经实现了以下方法来启动会话

$di->setShared('session', function () {
    $session = new Session();
    $session->start();
    return $session;
});
然后,当用户向服务发布用户名/密码时,我调用我的
loginUser
方法

public function loginUser(array $userData){
    $username = $userData['username'];
    $password = $userData['password'];
    $user = Users::findFirst(
        [
            'conditions' => '(username = :username:) AND password = :password:',
            'bind' => [
                'username'    => $username,
                'password'    => $password,
             ],
             'columns' => ['users_id AS id, first, last, username, email']
        ]
    );
    $this->_registerSession($user);
    return $user->toArray();
}
用户尝试登录后,我使用
\u registerSession($user)
方法将用户名和用户ID隐藏到会话中

private function _registerSession($user){
    $this->session->set(
        "auth",
        [
            "id" => $user->id,
            "username" => $user->username,
        ]
    );   
}
此时,用户可以成功登录,因为我可以返回用户ID、姓名、用户名和电子邮件,用户名和ID存储在我的会话
auth
configuration中

我遇到的问题是,当我刷新页面时,用户会注销。

我首先想到的是,因为我的Angular应用程序是SPA,所以刷新页面会删除我设置的当前全局变量,以存储当前用户的信息。因此,为了解决这个问题,我想我需要根据会话从服务器上重新提取信息

因此,我为
getCurrentUser()

当我使用Postman测试时,我可以发布到登录端点,然后在接下来的30分钟内,如果我调用
getCurrentUser
,我将返回我的值

但是当我在AngularJS应用程序中尝试这样做时,我总是在
$id
上得到一个空值,这告诉我它无法在session变量中拉/看不到
auth

我已经验证了Cookie中设置的PHPSESSIONID没有改变,因此sessionID应该仍然是相同的。。。那么,为什么它不能从Angular应用程序中的现有会话中提取该ID,但当我直接从邮递员那里打电话时它可以

编辑 有人提到可能是因为CORS。他们删除了他们的答案,但只是为了显示我的设置,这里是我附加某些标题的索引文件

if (isset($_SERVER['HTTP_ORIGIN'])) {
    // Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
    // you want to allow, and if so:
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        // may also be using PUT, PATCH, HEAD etc
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers:{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    exit(0);
}

它可能仍然与CORS有关,但根据我有限的知识,我不认为是这样。

首先尝试获取会话id:in
getCurrentUser()
use:

     $id = $this->session->get('auth');
     if (isset($id['id'])) {
         $user = ...

另外,在
loginUser
中,不要忘了将
用户名
绑定为电子邮件参数。

您确定angular 5正在使用凭据发出
请求:true

对于电子邮件,我去掉了很多额外的内容(尝试捕获错误处理、电子邮件登录等),但我会在原始问题中更新这一点。至于会话id,auth[“id”]中存储的值实际上是用户id。这在Postman中也可以正常工作(我可以发布到我的登录方法,然后如果我在10分钟后对getCurrentUser方法执行get操作,我会得到预期的结果。这仅在我从本地主机或部署的站点运行时失败,并且它没有错误消息,因为它正在读取ID(并为此进行身份验证)你能分享一下刷新页面时调用的控制器的代码吗?不,我一点也不确定。我模糊地记得我在谷歌搜索时提到过,但从来没有真正尝试过。我下班回家后会尝试一下。你能快速解释一下它的作用吗?只是用cookies发送角度请求。你可以检查这个答案
     $id = $this->session->get('auth');
     if (isset($id['id'])) {
         $user = ...