Проблема сессионной устойчивости в Phalcon PHP - PullRequest
0 голосов
/ 11 октября 2018

Я использую 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, но, исходя из моих ограниченных знаний, яне вижу, что это так.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы уверены, что angular 5 делает запросы с withCredentials: true?

0 голосов
/ 11 октября 2018

Сначала попытайтесь получить идентификатор сеанса: в getCurrentUser() используйте:

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

Также в loginUser не забудьте также связать username в качестве параметра электронной почты.

...