Perda da sessão na rota/view do php criada através da comunicação Ajax
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.
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.
Caso a pergunta não ficou claro, só informar, estou precisando muito da ajuda de alguém, desde já agradeço muito
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
Claudiano Lima
Curtidas 0
Respostas
Claudiano Lima
26/06/2020
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.
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.
Caso a pergunta não ficou claro, só informar, estou precisando muito da ajuda de alguém, desde já agradeço muito
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.
GOSTEI 0