2017-01-16 41 views
8

Jaki jest najlepszy sposób przesyłania informacji o sesji paszportowej z zaplecza do interfejsu?Dane sesji paszportowej JS w Angular2

Moja aplikacja działająca na porcie 3000. Pierwsze dwa pobrania służą do logowania na facebooku i przekierowania. Kolejny to, aby uzyskać dane z bazy danych użytkownika (ID użytkownika powinno być przechowywane w req.user)

routes.js:

app.get('/auth/facebook', passport.authenticate('facebook', { scope : 'email' })); 

app.get('/auth/facebook/callback', 
     passport.authenticate('facebook', { 
      successRedirect : 'http://localhost:8000/', 
      failureRedirect : '/fail' 
     }) 
); 

app.get('/auth/userdata', isLoggedIn, function(req, res) { 
    Donator.findById(req.user, function(err, fulluser) { 
     if (err) throw err; 
     res.json(fulluser); 
    }) 
}); 

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) { 
     next(); 
    } else { 
     res.json(false); 
    } 
}; 

paszport config.js

'facebookAuth' : { 
     'clientID'  : 'secret', 
     'clientSecret' : 'secret', 
     'callbackURL' : 'http://localhost:3000/auth/facebook/callback' 
    }, 

Tak w mojej aplikacji Angular2 Mogę przejść do http://localhost:3000/auth/facebook, zostać przekierowany na stronę logowania FB, a jeśli sukces zostanie przekierowany do http://localhost:3000/auth/login/callback, który zabierze mnie do http://localhost:8000/.

A w mojej aplikacji Angular2 który działa na porcie 8000

getUser(){ 
    this.http.get('http://localhost:3000/auth/userdata') 
    .map(res => return res.json()) 
} 

Everytime getUser() nazywa, zwraca 'false'. Czy istnieje prosty i bezpieczny sposób "wstrzyknięcia" danych sesji do mojego interfejsu na innym porcie? Również gdy przeglądam w przeglądarce http://localhost:3000/auth/userdata, widzę ten profil jako JSON.

Kiedy ustawiam backend i frontend na tym samym porcie To działa, facebook, twitter, google, local, wszystko jest w porządku i getUser zwraca pełny profil użytkownika.

Mam nadzieję, że to jasne.

+0

dlaczego nie podasz swojej aplikacji angular2 na porcie '3000'? –

+1

Chciałbym, aby nakładka na końcu kończyła się na osobnych hostach. – dmh126

+0

Proponuję uruchomić wszystko na tym samym porcie. Możesz mieć dwa serwery na różnych portach, ale proxy jeden z nich do drugiego za pomocą [express-http-proxy] (https://www.npmjs.com/package/express-http-proxy). –

Odpowiedz

4

To był problem z żądaniami w Angular2. Dodałem dane uwierzytelniające do każdego żądania:

getUser(){ 
    this.http.get('http://localhost:3000/auth/userdata', {withCredentials: true}) 
    .map(res => return res.json()) 
} 

A teraz wszystko jest w porządku.

+0

Witam, dodałem również {withCredentials: true} w mojej prośbie, ale dostać się do problemu, ale potem dodać res.header ("Access-Control-Allow-Origin", "http: // localhost: 4200"); na serwerze dostaję polecenie req.isAuthenticated() false. Jak rozwiązujesz ten problem? –

+0

Mam również 'res.header (" Access-Control-Allow-Methods "," GET, PUT, POST, DELETE, OPTIONS ");' w moich opcjach cors. I działa, także dla żądania POST powinieneś dołączyć opcje takie jak 'options = new RequestOptions ({nagłówki: nagłówki, zKredytacjami: true})' – dmh126