Fórum Perda da sessão na rota/view do php criada através da comunicação Ajax #611580
26/06/2020
0
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
Curtir tópico
+ 0
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.
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.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)