2016-06-06 17 views
7

Ich habe eine node.js Anwendung auf Port 5000 ausgeführt, wo ich Passport.js als Autorisierung verwenden. Ich ermächtige Benutzer aus einer Post-Anforderung, wo ich einen benutzerdefinierten Rückruf verwenden:Lokale Pass Autorisierung auf verschiedenen Ports

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); 
    }); 

Dies funktioniert gut, aber wenn ich lokale Entwicklung Ich habe ein Frontend Angular2-Anwendung, die auf einem anderen Port läuft (4200), so in Meine Entwicklung Ich bin nicht möglich, den autorisierten Benutzer zu bekommen: req.user ist undefined. Ich verwende Express-Session, um den autorisierten Benutzer zu speichern.

Wenn ich deploy ich bündle beide Anwendungen zusammen, so funktioniert alles.

Hat jemand eine gute und einfache Lösung für dieses Problem? Wieder ist es nur in der Entwicklung, ich habe dieses Problem.

+0

Warum laufen diese Dinge nicht * in Ihrer Entwicklungsumgebung zusammen? – m02ph3u5

+0

Ich benutze Angular 2 CLI, und weiß nicht, ob es möglich ist, meinen eigenen Knoten als Server zu verwenden, und wie es eingerichtet wird. – DNRN

Antwort

3

Sie können beide Dienste hinter Proxy verbergen, zum Beispiel Nginx. Und beide Ihre Dienste werden 1 Adresse verwenden.

NGINX Config Beispiel

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; 
    } 
} 

So werden alle Anforderungen http://example.com gehen Service Frontend und alle Anfragen http://example.com/api/ zu Backend-Service zu gehen.

+0

Ein kleines Beispiel würde die Qualität Ihrer Antwort verbessern. – m02ph3u5

+0

Das war in der Tat war ich gesucht! Vielen Dank! – DNRN

0

Ich glaube, dass Sie ein domänenübergreifendes Problem haben, da Sie auf verschiedenen Ports ausgeführt werden.

Dieses Problem bereits diskutiert wurde, und ich glaube, dass Sie eine Lösung finden Sie hier: Passport js fails to maintain session in cross-domain

Kurz gesagt, müssen Sie Ihren Server konfigurieren, dass die approperiate Header senden Cross-Domain-Sharing der Zugriffs Header zu ermöglichen .

Verwandte Themen