2016-06-06 25 views
7

Ho un'applicazione node.js in esecuzione sulla porta 5000, dove uso passport.js come autorizzazione. Autorizzo gli utenti da una richiesta POST, dove io uso un callback personalizzato:Autorizzazione locale del passaporto su porte diverse

this.router.post('/member/login', (req, res, next) => { 
     passport.authenticate('local', (err, member, info) => { 
     if (err) res.json(400).json({message: "An error ocurred"}); 
     if (!member) { 
      console.log("No member found!"); 
      return res.status(409).json({message: "No member found!"}) 
     } 
     req.logIn(member, (err) => { 
      if (err) { 
      console.log(err); 
      return res.status(400).json({message: "An error ocurred"}); 
      } 
      return res.json(member); 
     }); 
     })(req, res, next); 
    }); 

Questo funziona bene, ma quando sviluppo locale ho un frontend applicazione Angular2, che viene eseguito su una porta diversa (4200), quindi in il mio sviluppo non sono possibile ottenere l'utente autorizzato: req.user non è definito. Io uso express-session per memorizzare l'utente autorizzato.

Quando distribuisco raggruppo entrambe le applicazioni insieme, quindi tutto funziona.

Qualcuno ha una soluzione buona e semplice per questo problema? Anche in questo caso è solo in fase di sviluppo che ho questo problema.

+0

Perché queste cose * non sono in esecuzione * nel tuo ambiente di sviluppo? – m02ph3u5

+0

Sto utilizzando Angular 2 cli e non so se è possibile utilizzare il mio nodo come server e come configurarlo. – DNRN

risposta

3

È possibile nascondere entrambi i servizi dietro proxy, ad esempio Nginx. E entrambi i tuoi servizi saranno utilizzati 1 indirizzo.

Nginx esempio config

server { 
    listen 80; 

    server_name example.com; 

    proxy_set_header Host $http_host; 
    proxy_pass_header Server; 
    proxy_set_header X-Forwarded-For $remote_addr; 
    proxy_set_header X-Forwarded-Proto $scheme; 

    location/{ 
    proxy_pass http://frontend_address:port; 
    proxy_redirect default; 
    } 

    location ~ /api { 
    proxy_pass http://backend_address:port; 
    proxy_redirect default; 
    } 
} 

Quindi tutte le richieste http://example.com andrà al frontend del servizio, e tutte le richieste http://example.com/api/ andare al servizio di back-end.

+0

Un piccolo esempio aumenterebbe la qualità della risposta. – m02ph3u5

+0

Questo era davvero quello che stavo cercando! Grazie! – DNRN

0

Credo che tu abbia un problema interdominio, dal momento che stai utilizzando diverse porte.

Questo problema è stato discusso già, e io credo che si possa trovare una soluzione qui: Passport js fails to maintain session in cross-domain

In breve, è necessario configurare il server per inviare le intestazioni approperiate per consentire la condivisione tra domini delle intestazioni di accesso .