Perda da sessão na rota/view do php criada através da comunicação Ajax

26/06/2020

4

Olá, estou com um grande problema que está tirando minha paciência e noites de sono kkk, estou fazendo um projeto pessoal a onde estou usando uma estrutura MVC, com rotas e executando a estrutura com o próprio apache do PHP.

Na área de login do usuário, os dados do informado pelo usuário é enviado para uma rota de back-end através do Ajax, a onde é feita a validação do cliente para verificar se aquela conta existe. Até ai está funcionando perfeitamente não contém nem um problema.

O problema é que quando eu crio a sessão e passo os dados do desejado nessa sessão para ser resgatado na view/rota App(onde só quem tem acesso são os usuário que possuem contas e estão logados), eu simplesmente perco essa sessão, é como se não existisse ou eu não passasse nada nela, simplesmente uma array vazia.

Porém, na pagina de login, eu consigo visualizar no ajax que a array está preenchida corretamente, também tentei usar sem ajax, enviando os dados diretamente para a rota do back-end mas acontece a mesma coisa e eu não sei o que está acontecendo. Lembrando que quando o usuário é autenticado eu envio ele para a página de usuários através do JavaScript usando o location.href = '/app'.


Código jQuery que faz a validação de dados que o usuário enviou para efetuar o login.

function invalidRegister() {
  $('.loadingArea').hide();
  $('.sectionLoginOneInfo p').show();
  
  $('.sectionLoginOneForm').addClass('formInvalid');
  setTimeout(() => {  
    $('.sectionLoginOneForm').removeClass('formInvalid');
  }, 1000);
}

$('.sectionLoginOneForm form').on('submit', function(e) {
  e.preventDefault();
  $('.loadingArea').show()
  const form = $(this).serializeArray();
  const email = form[0];
  const password = form[1];
  // Validar email
  const valid = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
  let validate = true;

  if(email.value == '' || !valid.test(email.value)) {
    invalidRegister();
    $('.sectionLoginOneInfo p').html('Ops… Usuário invalido!');
    validate = false;
  }
  if(password.value == '' || password.value.length < 8) {
    invalidRegister();
    $('.sectionLoginOneInfo p').html('Ops… Usuário invalido!');
    validate = false;
  }
  if(validate) {
    $.ajax({
      type: 'post',
      url: '/authenticateUser',
      data: form,
      dataType: 'json',
      success: d => {
        if(d.messege == 'success') {
          // Envia o usuário para a página de usuários
          location.href='/app';
        } else {
          invalidRegister();
          $('.sectionLoginOneInfo p').html(d.messege);
        }
      },
      error: erro => {
        invalidRegister();
        $('.sectionLoginOneInfo p').html('Algum erro inesperado aconteceu, tente novamente mais tarde.');
      }
    })
  }
})



Função que faz a verificação de autenticidade do cliente, para verificar se a conta existe no banco de dados. Os posts estão sendo enviados pelo Ajax.

/**
	 * Função para autenticar a entrada do usuário no sistema
	 * @access public
	 */
	public function authenticateUser() {
		$info = array();
		$email = $_POST['email'];
		$password = $_POST['password'];

		// Criando conexão com o banco de dados e se comunicando com o modal.
		$user = Container::getModel('User');
		$user->__set('user_email', $email);
		$user->__set('user_password', $password);
		
		/**
		 * Verifica se o usuário existe.
		 * Verifica se o email do usuário existe no banco de dados, para depois veficar
		 *  a senha do usuário. Se estiver valido, iniciamos a sessão.
		 * @name $date
		 */
		$date = $user->getUserEmail();
		if(count($date) > 0) {
			if($this->checkArgon2id($password, $date[0]['user_password'])) {
				if($date[0]['user_confirmed'] == 1) {
					$_SESSION['authenticate'] = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
					$_SESSION['id'] = $date[0]['id'];
					$_SESSION['name'] = $date[0]['user_name'];
					$_SESSION['surname'] = $date[0]['user_surname'];
					$_SESSION['user_email'] = $date[0]['user_email'];
					$_SESSION['user_gender'] = $date[0]['user_gender'];

					// Informando ao ajax que o login foi efetuado com sucesso
					$info['messege'] = 'success';
				}
				else {
					// Informando ao ajax que o usuário falta confirmar seu acesso
					$info['messege'] = 'Você não confirmou o seu cadastro, por favor, verifique seu e-mail.';
				}
			}
		}
		else {
			// Informando o usuário não foi encontrado
			$info['messege'] = 'Ops… Usuário invalido!';
		}
		// Envia as informações da info para o Ajax, através do json
		print_r(json_encode($info, JSON_UNESCAPED_UNICODE));
	}




Caso a pergunta não ficou claro, só informar, estou precisando muito da ajuda de alguém, desde já agradeço muito
Responder

Posts

29/06/2020

Claudiano Lima

Olá, estou com um grande problema que está tirando minha paciência e noites de sono kkk, estou fazendo um projeto pessoal a onde estou usando uma estrutura MVC, com rotas e executando a estrutura com o próprio apache do PHP.

Na área de login do usuário, os dados do informado pelo usuário é enviado para uma rota de back-end através do Ajax, a onde é feita a validação do cliente para verificar se aquela conta existe. Até ai está funcionando perfeitamente não contém nem um problema.

O problema é que quando eu crio a sessão e passo os dados do desejado nessa sessão para ser resgatado na view/rota App(onde só quem tem acesso são os usuário que possuem contas e estão logados), eu simplesmente perco essa sessão, é como se não existisse ou eu não passasse nada nela, simplesmente uma array vazia.

Porém, na pagina de login, eu consigo visualizar no ajax que a array está preenchida corretamente, também tentei usar sem ajax, enviando os dados diretamente para a rota do back-end mas acontece a mesma coisa e eu não sei o que está acontecendo. Lembrando que quando o usuário é autenticado eu envio ele para a página de usuários através do JavaScript usando o location.href = '/app'.


Código jQuery que faz a validação de dados que o usuário enviou para efetuar o login.

function invalidRegister() {
  $('.loadingArea').hide();
  $('.sectionLoginOneInfo p').show();
  
  $('.sectionLoginOneForm').addClass('formInvalid');
  setTimeout(() => {  
    $('.sectionLoginOneForm').removeClass('formInvalid');
  }, 1000);
}

$('.sectionLoginOneForm form').on('submit', function(e) {
  e.preventDefault();
  $('.loadingArea').show()
  const form = $(this).serializeArray();
  const email = form[0];
  const password = form[1];
  // Validar email
  const valid = new RegExp(/^[A-Za-z0-9_\\-\\.]+@[A-Za-z0-9_\\-\\.]{2,}\\.[A-Za-z0-9]{2,}(\\.[A-Za-z0-9])?/);
  let validate = true;

  if(email.value == '' || !valid.test(email.value)) {
    invalidRegister();
    $('.sectionLoginOneInfo p').html('Ops… Usuário invalido!');
    validate = false;
  }
  if(password.value == '' || password.value.length < 8) {
    invalidRegister();
    $('.sectionLoginOneInfo p').html('Ops… Usuário invalido!');
    validate = false;
  }
  if(validate) {
    $.ajax({
      type: 'post',
      url: '/authenticateUser',
      data: form,
      dataType: 'json',
      success: d => {
        if(d.messege == 'success') {
          // Envia o usuário para a página de usuários
          location.href='/app';
        } else {
          invalidRegister();
          $('.sectionLoginOneInfo p').html(d.messege);
        }
      },
      error: erro => {
        invalidRegister();
        $('.sectionLoginOneInfo p').html('Algum erro inesperado aconteceu, tente novamente mais tarde.');
      }
    })
  }
})



Função que faz a verificação de autenticidade do cliente, para verificar se a conta existe no banco de dados. Os posts estão sendo enviados pelo Ajax.

/**
	 * Função para autenticar a entrada do usuário no sistema
	 * @access public
	 */
	public function authenticateUser() {
		$info = array();
		$email = $_POST['email'];
		$password = $_POST['password'];

		// Criando conexão com o banco de dados e se comunicando com o modal.
		$user = Container::getModel('User');
		$user->__set('user_email', $email);
		$user->__set('user_password', $password);
		
		/**
		 * Verifica se o usuário existe.
		 * Verifica se o email do usuário existe no banco de dados, para depois veficar
		 *  a senha do usuário. Se estiver valido, iniciamos a sessão.
		 * @name $date
		 */
		$date = $user->getUserEmail();
		if(count($date) > 0) {
			if($this->checkArgon2id($password, $date[0]['user_password'])) {
				if($date[0]['user_confirmed'] == 1) {
					$_SESSION['authenticate'] = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
					$_SESSION['id'] = $date[0]['id'];
					$_SESSION['name'] = $date[0]['user_name'];
					$_SESSION['surname'] = $date[0]['user_surname'];
					$_SESSION['user_email'] = $date[0]['user_email'];
					$_SESSION['user_gender'] = $date[0]['user_gender'];

					// Informando ao ajax que o login foi efetuado com sucesso
					$info['messege'] = 'success';
				}
				else {
					// Informando ao ajax que o usuário falta confirmar seu acesso
					$info['messege'] = 'Você não confirmou o seu cadastro, por favor, verifique seu e-mail.';
				}
			}
		}
		else {
			// Informando o usuário não foi encontrado
			$info['messege'] = 'Ops… Usuário invalido!';
		}
		// Envia as informações da info para o Ajax, através do json
		print_r(json_encode($info, JSON_UNESCAPED_UNICODE));
	}




Caso a pergunta não ficou claro, só informar, estou precisando muito da ajuda de alguém, desde já agradeço muito


Eu encontrei o problema é que tinha esquecido que ativei o session.cookie_secure do meu php.ini, fazendo com que ele só criasse o cookie da sessão se eu estivesse com uma conexão segura (SSL), por isso ele não estava executando. Porém, com pesquisas para encontra algo para substituir essa forma de login, encontrei o JWT (Json Web Token), que segundo alguns artigos é mais seguro usar JWT do que a session do php, já que a session fica exposta ao usuário, fazendo com que ele possa editar o cookie de sessão e entrar na área de clientes, já com jwt ele só iria conseguir se tivesse a senha usada para gerar o JWT, fazendo com que a segurança fosse mais forte nesse sentido.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar