2016-01-12 24 views
6

Zajmuję się tworzeniem aplikacji MEAN. Używam paszportu do uwierzytelniania - strategii lokalnych, facebookowych i google.jak radzić sobie z oddzwanianiem od strony paszportowej i facebookowej w kanciastym kliencie?

Używam klienta angularjs. Wszystkie trasy są obsługiwane przez klienta. Używam tylko danych serwera apis.

Podczas korzystania ze strategii paszportowej na Facebooku używam poniższego kodu na serwerze węzła zgodnie z dokumentami paszportowymi.

app.get('/auth/facebook',passport.authenticate('facebook-auth', { scope : ['email'] })); 
    app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', { 
     successRedirect : '/home', 
     failureRedirect : '/login', 
     scope:['email'] 
    })); 

Problem jestem stoi to gdy użytkownik kliknie przycisk „Zaloguj się za pomocą Facebooka”

<a href="/auth/facebook" class="btn"><i class="fa fa-facebook"></i> Sign in using Facebook</a> 

Klient będzie miał dostęp do „/ auth/Facebook” trasę, która będzie ostatecznie przekierowuje użytkownika do strony facebook walidacji poświadczenia użytkownika.

Po pomyślnym sprawdzeniu poprawności użytkownik zostanie przekierowany do trasy "/ home" zdefiniowanej w wartości "successRedirect".

Chodzi o to, że chcę używać niestandardowej funkcji oddzwaniania zamiast definiowania przekierowań w celu osiągnięcia sukcesu lub niepowodzenia. Będzie wyglądać jak poniżej:

problemem
app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', function(err,user,info){ 
    if(err){ 
      throw err; 
     } 
     else if(user === 'userexists'){ 
      res.json({ 
       'state':false, 
       'message':'User with this e-mail already exists' 
      }); 
     } 
     else{ 
      req.logIn(user,function(loginErr){ 
       if(loginErr){ 
        throw loginErr; 
       } 
       res.json({ 
        'state':true, 
        'message':'You logged in successfully!' 
       }); 
      }); 
     } 
})); 

Korzeń Jestem stoi tutaj, nie mogę używać powyżej niestandardowego zwrotnego jako klient nie jest wywołanie „auth/facebook/oddzwanianie” Trasa, nazywana jest przez Facebook. Tak więc, nie ma żadnego programisty sukcesu czekającego, aby złapać powyższą odpowiedź oddzwonienia po stronie klienta !!

Potrzebuję sposobu, aby uzyskać odpowiedź w postaci json na kliencie, aby wyeliminować przekierowanie po stronie serwera, a także sposób przekazywania wiadomości i nazwy użytkownika do klienta po pomyślnym uwierzytelnieniu przez Facebook.

Zaraz zrezygnuję z paszportu. Mając nadzieję na jakiekolwiek możliwe rozwiązanie przed usunięciem dużej ilości kodu!

Dzięki

Odpowiedz

2

Można to osiągnąć poprzez przekierowanie do innego punktu końcowego wewnątrz uchwytu facebook zwrotnego. Nie ma potrzeby wykonywania res.json() na oddzwanianiu z Facebooka, ponieważ wysyłają do niego tylko żądanie, aby poinformować Cię, jeśli auth nie powiódł się lub odniósł sukces. From their docs:

// GET /auth/facebook/callback 
// Use passport.authenticate() as route middleware to authenticate the 
// request. If authentication fails, the user will be redirected back to the 
// login page. Otherwise, the primary route function function will be called, 
// which, in this example, will redirect the user to the home page. 

Więc facebook wraca kontrolę nad procesem żądanie z powrotem do Ciebie, gdy nazywają /auth/fb/callback ale to zależy od ciebie, co robić dalej. Ponieważ po pomyślnym uwierzytelnieniu użytkownika masz dostęp do req.user dostępnej przez całą sesję. W tym momencie możesz przekierować do czegoś podobnego do tego w przykładzie /account i sprawdzić, czy req.user z req.isAuthenticated() i zakończyć pożądany przepływ.

+0

Wielkie dzięki za jasną odpowiedź! – Designeer

+0

@Designeer nie ma za co. Po powrocie w przypadku pojawienia się więcej problemów: D – onel0p3z

+0

@ onel0p3z Robię to samo w reactjs zamiast kąta. Mój serwer jest na węźle i używam express. Z powodzeniem zaimplementowałem paszport-facebook po mojej stronie serwera. Teraz nazywam "/ auth/facebook" od reagowania za pomocą znacznika zakotwiczenia. Ale nie mam pojęcia, jak odzyskać odpowiedź na to w reakcji, ponieważ jest obsługiwana tylko przez serwer i nie chcę obsługiwać go poprzez response.redirect na serwerze .. Czy możesz zasugerować, jak sobie z tym poradzić? – Vijay