Я использую 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();
}
После того, как пользователь попытается войти в систему, я сохраняю имя пользователя и идентификатор пользователя в сеансе, используя метод _registerSession($user)
.
private function _registerSession($user){
$this->session->set(
"auth",
[
"id" => $user->id,
"username" => $user->username,
]
);
}
На данный момент пользователь может успешно войти в систему, так как я могу вернуть идентификатор пользователя, имя и фамилию, имя пользователя и адрес электронной почты, с именем пользователя и идентификатором, сохраненными в моих сеансахauth
конфигурация.
Проблема, с которой я столкнулся, заключается в том, что когда я обновляю свою страницу, Пользователь выходит из системы.
Первое, что я понял, было то, что смое приложение Angular представляет собой SPA, поэтому при обновлении страницы будет сброшена текущая глобальная переменная, которую я установил для хранения информации о текущем пользователе.Итак, чтобы исправить это, я думаю, что мне нужно повторно получить информацию с сервера на основе сеанса.
Итак, я реализовал метод для 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, я могу отправлять сообщения в конечную точку входа в систему, а затем в любое время вСледующие 30 минут, если я сделаю вызов getCurrentUser
, я получу обратно свои значения.
НО, когда я пытаюсь сделать это в приложении AngularJS, я всегда получаю нулевое значение на $id
, котороеговорит, что не может вытащить / не видит auth
в переменной сеанса.
Я убедился, что PHPSESSIONID, установленный в файлах cookie, не меняется, поэтому sessionID должен оставаться прежним ... Так почему он не может извлечь этот идентификатор из существующего сеанса в Angularприложение, но оно может, когда я звоню напрямую из PostMan?
EDIT Кто-то упомянул, что это может быть связано с 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, но, исходя из моих ограниченных знаний, яне вижу, что это так.