Session Phalcon 中的持久性问题 PHP
Session Persistance Issue in Phalcon PHP
我正在使用 PhalconPHP,并尝试实施身份验证服务。我的 front-end 是一个 AngularJS 5 应用程序,它使用子域上的此服务。 (我的前端在www.MyWebsite.com,我的服务在service.MyWebsite.com)到此为止我实现了下面的方法来启动我的session.
$di->setShared('session', function () {
$session = new Session();
$session->start();
return $session;
});
然后,当用户 post 将他们的 username/password 发送到服务
时,我调用我的 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();
}
用户尝试登录后,我使用 _registerSession($user)
方法将用户名和用户 ID 存储到 session 中。
private function _registerSession($user){
$this->session->set(
"auth",
[
"id" => $user->id,
"username" => $user->username,
]
);
}
此时,用户能够成功登录,因为我能够 return 用户 ID、名字和姓氏、用户名和电子邮件,用户名和 ID 存储在我的sessions auth
配置。
我遇到的问题是,当我刷新页面时,用户会注销。
我想到的第一件事是,由于我的 Angular 应用程序是一个 SPA,因此刷新页面将删除我设置的用于存储当前用户信息的当前全局变量。所以,为了解决这个问题,我想我需要 re-pull 来自服务器的信息基于 session。
所以,我实现了 getCurrentUser()
的方法
public function getCurrentUser(){
$id = $this->session->auth["id"];
if($id == null){
return null;
}
$user = Users::findFirst(
[
'conditions' => 'users_id = :id:',
'bind' => [
'id' => $id,
],
'columns' => "users_id AS id, first, last, username, email",
]
);
$this->_registerSession($user);
return $user->toArray();
}
当我使用 Postman 对此进行测试时,我能够 post 到登录端点,然后在接下来的 30 分钟内随时调用 getCurrentUser
,我最终找回我的价值观。
但是当我尝试在 AngularJS 应用程序中执行此操作时,我总是在 $id
上得到一个空值,这告诉我它无法 pull/doesn 看不到session 变量中的 auth
。
我已经确认在 cookie 中设置的 PHPSESSIONID 没有改变,所以 sessionID 应该仍然是相同的...那么为什么它不能从现有的 ID 中提取该 ID session 在 Angular 应用程序中,但当我直接从 PostMan 拨打电话时可以吗?
编辑
有人提到这可能是由于 CORS。他们删除了他们的答案,但只是为了展示我的设置,这是我在其中附加某些 headers
的索引文件
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:在 getCurrentUser()
中使用:
$id = $this->session->get('auth');
if (isset($id['id'])) {
$user = ...
此外,在 loginUser
中不要忘记将 username
绑定为电子邮件参数。
您确定 angular 5 正在向 withCredentials: true
发出请求吗?
我正在使用 PhalconPHP,并尝试实施身份验证服务。我的 front-end 是一个 AngularJS 5 应用程序,它使用子域上的此服务。 (我的前端在www.MyWebsite.com,我的服务在service.MyWebsite.com)到此为止我实现了下面的方法来启动我的session.
$di->setShared('session', function () {
$session = new Session();
$session->start();
return $session;
});
然后,当用户 post 将他们的 username/password 发送到服务
时,我调用我的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();
}
用户尝试登录后,我使用 _registerSession($user)
方法将用户名和用户 ID 存储到 session 中。
private function _registerSession($user){
$this->session->set(
"auth",
[
"id" => $user->id,
"username" => $user->username,
]
);
}
此时,用户能够成功登录,因为我能够 return 用户 ID、名字和姓氏、用户名和电子邮件,用户名和 ID 存储在我的sessions auth
配置。
我遇到的问题是,当我刷新页面时,用户会注销。
我想到的第一件事是,由于我的 Angular 应用程序是一个 SPA,因此刷新页面将删除我设置的用于存储当前用户信息的当前全局变量。所以,为了解决这个问题,我想我需要 re-pull 来自服务器的信息基于 session。
所以,我实现了 getCurrentUser()
public function getCurrentUser(){
$id = $this->session->auth["id"];
if($id == null){
return null;
}
$user = Users::findFirst(
[
'conditions' => 'users_id = :id:',
'bind' => [
'id' => $id,
],
'columns' => "users_id AS id, first, last, username, email",
]
);
$this->_registerSession($user);
return $user->toArray();
}
当我使用 Postman 对此进行测试时,我能够 post 到登录端点,然后在接下来的 30 分钟内随时调用 getCurrentUser
,我最终找回我的价值观。
但是当我尝试在 AngularJS 应用程序中执行此操作时,我总是在 $id
上得到一个空值,这告诉我它无法 pull/doesn 看不到session 变量中的 auth
。
我已经确认在 cookie 中设置的 PHPSESSIONID 没有改变,所以 sessionID 应该仍然是相同的...那么为什么它不能从现有的 ID 中提取该 ID session 在 Angular 应用程序中,但当我直接从 PostMan 拨打电话时可以吗?
编辑 有人提到这可能是由于 CORS。他们删除了他们的答案,但只是为了展示我的设置,这是我在其中附加某些 headers
的索引文件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:在 getCurrentUser()
中使用:
$id = $this->session->get('auth');
if (isset($id['id'])) {
$user = ...
此外,在 loginUser
中不要忘记将 username
绑定为电子邮件参数。
您确定 angular 5 正在向 withCredentials: true
发出请求吗?