2017-04-06 47 views
6

(Już robię) Riffuję z numeru https://scotch.io/tutorials/easy-node-authentication-linking-all-accounts-together, ale chcę korzystać z tej usługi uwierzytelniania społecznego dla wielu aplikacji, np. Tej, która kontroluje system ogrzewania, tej, która włącza tryskacze itp.Jak przekazać dodatkowy parametr do paszportu.authenticate

Zasadniczo, jeśli jedna z tych aplikacji sprawdzi się na serwerze i nie ma prawidłowego tokena, zostanie przekierowana do tej usługi uwierzytelniania społecznego (social-auth). Gdy użytkownik naciśnie na przyciski logowania społecznych chwyta parametr co app jego przybyciu z i dodaje go jako parametr dla /auth/facebook/:appid

// send to facebook to do the authentication 
    app.get('/auth/facebook/:appId', function(req,res,next){ 
     passport.authenticate(
      'facebook', { scope : 'email' } 
     )(req,res,next); 
    }); 

req z req,res,next jest odcinkach rekord użytkownika. W tym momencie social-auth nie wie, kim jest użytkownik.

fbStrategy.passReqToCallback = true; 
passport.use(new FacebookStrategy(fbStrategy, 
    function(req, token, refreshToken, profile, done) { 
     var email = (profile.emails[0].value || '').toLowerCase()  
     process.nextTick(function() {... 

Po zakończeniu autoryzacji Chcę przekierowanie z powrotem do aplikacji wywołującej i muszę :appId param się jechać, więc mogę wrócić do prawej strony.

Generalnie zadziała, jeśli zmienię taką jak currentAppId, dostępną dla różnych strategii społecznych, ale jeśli zdarzyło Ci się, że wiele osób uwierzytelnia się w tym samym czasie, to możliwe, że użytkownik powróci do niewłaściwej aplikacji lub aplikacja innych użytkowników. Dlatego potrzebuję appId, aby podróżować jako parametr do passport.authenticate. Gdzie powinienem szukać, jak to zrobić. Czy mogę owinąć passport.authenticate lub w inny sposób zmodyfikować rzeczy?

Odpowiedz

2

Możesz użyć samego żądania do przeniesienia dodatkowych parametrów zi do funkcji strategii. W poniższym przykładzie zastosowano dwa parametry: _toParam i _fromParam.

app.get('/auth/facebook/:appId', function(req,res,next){ 
    req._toParam = 'Hello'; 
    passport.authenticate(
     'facebook', { scope : 'email' } 
    )(req,res,next); 
}) 


fbStrategy.passReqToCallback = true; 
passport.use(new FacebookStrategy(fbStrategy, 
    function(req, token, refreshToken, profile, done) { 
     console.log(req._toParam); 
     req._fromParam = 'Hello 2'; 
     var email = (profile.emails[0].value || '').toLowerCase()  
    process.nextTick(function() {... 

Jeśli chcesz zapisać identyfikator dla dalszych żądań, możesz użyć mapy z gniazdem bieżącego żądania jako kluczem.

+0

Świetne, wielkie dzięki. Próbowałem znaleźć Twoją ostatnią sugestię za pomocą wyszukiwań takich jak "wolne gniazdo pośrednie bieżącego żądania", ale tak naprawdę nie znalazłem nic. Wszelkie odniesienia będą mile widziane – mcktimo

+0

Właściwie to nie działa passport.use (nowe FacebookStrategy (fbStrategy, funkcję (req, żeton, refreshToken, profil, zrobione) { console.log (req._toParam); przychodzi z powrotem jako niezdefiniowany, mimo że jest zdefiniowany tutaj. app.get ('/ auth/facebook /: appId', funkcja (req, res, następna) { req.toarab = req.params.appId console.log (req._toParam) Czytałem niewłaściwy dziennik – mcktimo

+0

Dla wszystkich społecznych strategii auth, req zostaje zastąpiony przez req.user – mcktimo