Phalcon PHP中的会话持久性问题
我正在使用PhalconPHP,并试图实现一个身份验证服务。我的前端是一个AngularJS 5应用程序,它利用子域上的这个服务。(我的前端位于www.MyWebsite.com,我的服务位于service.MyWebsite.com)到目前为止,我已经实现了以下方法来启动会话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
$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 = ...