2012-12-02 11 views
8

Używam passport.js do uwierzytelniania użytkowników. Chciałbym móc przekazać nazwę użytkownika, pobraną od użytkownika, która dotrze do końca procesu uwierzytelniania, aby móc przechowywać nazwę użytkownika podczas tworzenia użytkownika (jeśli jeszcze nie istnieje). Próbowałem to:Jak mogę przekazać parametr przez moją sieć passport.js?

app.get("/auth/google", function(request, response) 
{ 
    console.log(request.query.username); 

    passport.authenticate("google", 
    { 
     scope: 
     [ 
      "https://www.googleapis.com/auth/userinfo.profile", 
      "https://www.googleapis.com/auth/userinfo.email" 
     ] 
    })(request, response); 
}); 

app.get("/auth/google/callback", function(request, response) 
{ 
    console.log(request.query.username); 

    passport.authenticate("google", 
    { 
     successRedirect: "/", 
     failureRedirect: "htm/error" 
    })(request, response); 
}); 

Wezwanie do/auth/google wypisuje nazwy użytkownika, ale drukuje wywołania zwrotnego niezdefiniowana. Nawet jeśli mógłbym uzyskać nazwę użytkownika do wywołania zwrotnego, nadal nie jestem pewien, w jaki sposób dostałbym go do strategii Google. Czy musiałbym wtedy stworzyć własną strategię, aby to zadziałało?

Odpowiedz

7

można przekazać państwu obiekt do passport.authenticate, tak:

passport.authenticate("google", 
{ 
    scope: 
    [ 
     "https://www.googleapis.com/auth/userinfo.profile", 
     "https://www.googleapis.com/auth/userinfo.email" 
    ], 
    state: request.query.username 
})(request, response); 

Można uzyskać dostęp do stanu poprzez req.query.state.

Nazwa użytkownika powinna być ciągiem, a nie obiektem. Jeśli chcesz zapisać obiekt w stanie, zadzwoń pod numer JSON.stringify i przeanalizuj go w wywołaniu zwrotnym.

1

Dla każdego używającego OpenID, zapytanie wydaje się być nadpisane przez parametry zapytania OpenId i dlatego nie można go przekazać bezpośrednio. Możesz jednak załączyć zmienne do req.session.

router.get('/auth/social', (req, res, next) => { 
    req.session.foo = req.query.foo; 
    next(); 
}, passport.authenticate('social')); 

i nie zapomnij podać flagę passReqToCallback w opcjach strategia:

{ 
    passReqToCallback: true, 
    returnURL: config.app.returnUrl, 
    realm: config.app.realm, 
    apiKey: config.app.apiKey 
} 
+0

możliwe jest, że sesje i ciasteczka są zastępowane przez strategii OpenID (https://github.com/liamcurry/passport-steam)? Próbowałem Twojego rozwiązania, ale 'req.session.foo' jest' niezdefiniowanym 'w trasie wywołania zwrotnego. – guest459473

Powiązane problemy