Ir para conteúdo
Master_Cyber

Compartilhar session entre subdomínios

Recommended Posts

Bom dia galera,

 

estou trabalhando em um projeto que consiste em dois sistemas, um em PHP/Ajax e o outro em Angular 5, ambos fazem requisição em um webservice (Apigility). O banco é postgres.

 

A questão é que quando a pessoa logar na tela de login sistema PHP, ele automaticamente logue no sistema Angular, que basicamente a "session" é guardada no localstorage.

 

Então pensei em trabalhar com session para compartilhar token e dados do usuário.

 

O problema é que não consigo compartilhar a mesma session entre o sistema e o webservice, nem o localstorage é compartilhado.

 

Estou bastante confuso como resolver isso..

 

Pensei em colocar os dados da session no banco de dados também.

 

Podem me ajudar? Dar outras soluções?

 

Obrigado.

 

OBS: Todos os sistemas (api, sistema php e angular) envolvidos estão no mesmo servidor, mas em subdomínios diferentes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como funcionaria essa sessão no banco?

 

Eu guardaria a session_id no banco, mas no outro sistema, a session_id já é outra...

 

Como eu localizo o registro do cara?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Master_Cyber, tranquilo?

 

Como você está lidando com API REST e SPA, o mais apropriado seria manter as requisições à sua API independentes de estado (stateless). E isso você consegue abrindo mão do uso de sessions/cookies. Esse é definitivamente o caminho mais apropriado para o seu caso.

Nesse caso você deveria implementar um processo de autenticação baseado em OAuth / OAuth2 e similares ou JWT token.

 

Bom, antes de qualquer coisa, qual é a diferença entre uma mecânica e outra?

1 - Com sessões/cookies você precisa armazenar as informações relacionadas a cada sessão dos usuários em arquivos separados no servidor (e no cliente também). Quando você lida com instâncias (máquinas) únicas de servidores isso é simples: as sessões ficam por padrão na pasta /tmp (em servidores Linux), mas isso varia da configuração da sua hospedagem.

 

Quando a demanda de sua aplicação cresce, você precisa escalar essas sessões, ou seja, torná-las acessíveis em mais de uma máquina, para que as requisições podem ser respondidas regularmente, independente de qual máquina é requisitada.

Outro cenário é o que você está passando, onde duas aplicações distintas precisam ter conhecimento sobre as sessões dos usuários.

 

Como resolver isso utilizando sessões? Bom, para o primeiro caso (escalabilidade) existem sticky sessions, mas não é o seu caso e não é a melhor solução de qualquer forma.

Você também pode simplesmente inserir as sessões em outro lugar (como um banco de dados ou um serviço de cache). E isso é bem simples de ser feito. Veja um exemplo na AWS com DynamoDb. Essa seria uma solução.

 

O problema é que utilizar sessões não é o melhor caminho para SPAs e inclusive nem está documentado pela Apigility que você citou.

 

2 - Com JWT ou OAuth não existe estado, nem sessões, mas existem várias chaves que devem ser trafegadas com o objetivo de autenticar (verificar identidade) e autorizar (verificar permissões/acesso) os usuários.

Após o processo de login, o usuário terá uma chave, que deve ser armazenado pela sua SPA em localStorage (ou outra forma) e enviado em toda e qualquer requisição que exija acesso privilegiado.

Você encontra toda a documentação de como fazer isso aqui (navegue no menu lateral): https://apigility.org/documentation/auth/intro

 

Resumindo: no seu caso, basta estudar e seguir o que é explicado nesse último link para autenticar os usuários.

 

Não quis complicar muito explicando como funcionam as requisições a fundo (especificações HTTP e cada etapa de ambos os processos), mas caso queira se aprofundar mais, esse material é excelente: https://ponyfoo.com/articles/json-web-tokens-vs-session-cookies

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa cara, muito obrigado pela explicação... Me ajudou muito, vou estudar a melhor solução para minha situação..

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Claudia França
      Pessoal estou com um problema para homologar um pagamento service.
       o resultado do Status deve ser sucessfull.
      Parte do codido do index.
      "

          $('#payButton').one('click', function(){
              var amount = $('input[name=amount]').val();
              var currency = $('[name=currency]').val();
              console.log(amount, currency);
              V.init( {
                  apikey: '<?php echo $visaApiKey ?>',
                  settings: {
                      //logoUrl: 'https://www.novachance.org.br/wp-content/uploads/2018/06/xLogo_INC.jpg.pagespeed.ic.QrM-Azm3n5.jpg',
                      locale: 'en_US',
                      displayName: 'Viva a Musica',
                      websiteUrl: 'https://www.vivaamusica.org.br',
                      customerSupportUrl: 'https://www.vivaamusica.org.br/contato',
                      dataLevel: 'FULL'
                  },
                  paymentRequest: {
                      currencyCode: currency,
                      total: amount,
                      merchantRequestId: 'you can send any value to API ang get it in callback',
                      orderId: 'you can send any value to API ang get it in callback',
                      description: 'any order description if needs'
                  }
              });
                V.on('payment.success', function(payment) {
                  console.log('Visa success:', JSON.stringify(payment));
                  $('#succesOverlay').show();
                  $.ajax({
                      type: 'POST',
                      url: 'mailer.php',
                      data: {json: JSON.stringify(payment)},
                      dataType: 'json',
                      success: function(data){
                        console.log('Ajax success');
                        console.log(data);
                        location = 'thanks.php';
                      },
                      error: function(jqXHR, textStatus, errorThrown) {
                        console.log('Ajax error:');
                        console.log(textStatus, errorThrown);
                      }
                  });
              });
              V.on('payment.cancel', function(payment){
                  console.log('Canceled:', payment);
              });
              V.on('payment.error', function(payment, error){
                  console.log('Visa error:', payment, error);
              });
              $('.v-button').click();
          })
       
      "
       Chamada Json
       
      "
      "Customer": {
              "Name": "[$userFullName]"
          },
          "Payment": {
              "ServiceTaxAmount": 0,
              "Installments": 1,
              "Interest": 0,
              "Capture": false,
              "Authenticate": false,
              "Recurrent": false,
              "CreditCard": {
                  "CardNumber": "453211******1521",
                  "Holder": "Gama Gama",
                  "ExpirationDate": "08/2020",
                  "SaveCard": false,
                  "Brand": "Visa"
              },
              "Tid": "0319040817883",
              "ProofOfSale": "817883",
              "AuthorizationCode": "027795",
              "Wallet": {
                  "Type": "VisaCheckout",
                  "WalletKey": "1140814777695873901",
                  "Eci": 0
                  },
              
              "SoftDescriptor": "123456789ABCD",
              "Amount": 100,
              "ReceivedDate": "2018-03-19 16:08:16",
              "Status": "eventStatus",
              "IsSplitted": false,
              "ReturnMessage": "Operation Successful",
              "ReturnCode": "4",
              "PaymentId": "e57b09eb-475b-44b6-ac71-01b9b82f2491",
              "Type": "CreditCard",
              "Currency": "BRL","en_US",
              "Country": "BRA","USA",
              
              
          
      "updateInfo":  {
               "payInfo": {
               "reason": "Pagamento","Payment",
               "avsResponseCode": "Y",
               "Amount": 91.00,
               "currencyCode": "USD",
               "eventStatus": "Success",
               "eventType": "Authorize",
               "PaymentId": "e57b09eb-475b-44b6-ac71-01b9b82f2491",
              
               }
      }
           
            }
      }
      {
       
       
      "
       
       
      O pessoal da empresa me fala que tenho que enviar o CallID gerado ( não sei como faço isso) e fazer a chamado do alteração de evento quando a transação for sucesso.
       
      Pensei em criar um aquivo payment.php mas pelo que li no manual necessariamente, não eh necessário.
       
    • Por edison.silva
      Pessoal, alguem tem algum exemplo em php de geração do arquivo .TXT2 da NFe ou MDFe e o envio para API de rotas dele?
    • Por eduuh1524
      Olá.
      Boa noite a todos,eu preciso de uma ajuda.
      Eu tenho um projeto em PHP e MySQL
      Tem uma database chamada easy e a uma tabela chamada usuários
      E dentro da tabela tem usuário,senha, saldo
       
      Bem.
      Eu tenho um random resultados em duas form na (resultados.php)eu queria fazer que quando a pessoa clicasse no botão Gerar usasse o saldo e gerasse o resultado.
      Exemplo,a pessoa já começa com 1000 de saldo e o botão diminui esse saldo em 100 e quando esse saldo chegasse em 0 se tentasse usar dá um erro de saldo insuficiente.
      Como posso fazer isso?
      Dei uma olhada em uns artigos aqui mas estou meio confuso,sou iniciante em PHP mas tenho uma noçãozinha .
      Boa noite a todos.
       
    • Por rd111072
      Olá, moçada!

      Tenho esse gráfico aqui: http://riocir.com.br/renan/chart_barg_g2.php 
      Mas ele exibe só os dias da semana do mês 1. Queria que ele exibisse todos os dias de todos os meses (como é o resultado do echo).

      Segue o código. Alguém pode me ajudar?
       
       
    • Por capaldi
      <?php
      if(isset($_GET['deletar']) && $_GET['deletar'] == 'sim'):
          $id_produto = (int)$_GET['produto'];
          $pegar_dados_produto = BD::conn()->prepare("SELECT img_padrao FROM loja_produtos WHERE id = ?");
          $pegar_dados_produto->execute(array($idProduto));
          $dadosProd = $pegar_dados_produto->fetchObject();
          
          $verificar_imagens = BD::conn()->prepare("SELECT * FROM loja_imgprod WHERE id_produto = ?");
          $verificar_imagens->execute(Array($idProduto));
          
          if($verificar_imagens->rowCount() == 0){
              if(unlink('../../produtos/'.$dadosProd->img_padrao)){
                  $deletar_produto =BD::conn()->prepare("DELETE FROM loja_produtos WHERE id = ?");
                  if($deletar_produto->execute(array($IdProduto))){
                      echo'<script>alert("Produto excluido com sucesso!");location.href"index.php?pagina=editarProdutos</script>';    
                  }
                  
              }
              
          }else{
              while($dadosImagenm = $verificar_imagens->fetchObject()){
                  unlink('../../produtos/'.$dadosImagem->img);
              }
              if(unlik('../../produtos/'.$dadosProd->img_padrao)){
                  $deletar_produto = BD::conn()->prepare("DELETE FROM loja_produtos WHERE id = ?");
                  if($deletar_produto->execute(array($idproduto))){
                      echo'<script>alert("Produto excluido com sucesso!");location.href"index.php?pagina=editarProdutos</script>';
                  }
              }
          }
      endif;
      ?>
       
      Ola, estou tabalhando com esse script, e não consigo resolver esse problema alguém pose me ajudar?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.