2012-12-02 18 views
8

मैं उपयोगकर्ताओं को प्रमाणीकृत करने के लिए 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); 
}); 

कॉल करने के लिए/प्रमाणन/google उपयोगकर्ता नाम प्रिंट, लेकिन कॉलबैक प्रिंट अपरिभाषित। यहां तक ​​कि अगर मैं कॉलबैक में उपयोगकर्ता नाम प्राप्त कर सकता हूं, तो भी मुझे यकीन नहीं है कि मैं इसे Google रणनीति में कैसे प्राप्त करूंगा। क्या मुझे इसे काम करने के लिए अपनी रणनीति बनाना होगा?

उत्तर

7

आप passport.authenticate है, इसलिए की तरह एक राज्य वस्तु पारित कर सकते हैं:

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

आप req.query.state के माध्यम से राज्य तक पहुँच सकते हैं।

उपयोगकर्ता नाम एक स्ट्रिंग होना चाहिए, ऑब्जेक्ट नहीं। यदि आप राज्य में किसी ऑब्जेक्ट को स्टोर करना चाहते हैं, तो JSON.stringify पर कॉल करें और इसे कॉलबैक में पार्स करें।

1

ओपनआईडी का उपयोग करने वाले किसी भी व्यक्ति के लिए, req.query OpenId क्वेरी पैरा द्वारा ओवरराइट किया जाता है और इस प्रकार सीधे से पारित नहीं किया जा सकता है। हालांकि आप req.session में चर संलग्न कर सकते हैं।

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

और भूल नहीं है रणनीति विकल्पों में passReqToCallback ध्वज शामिल करने के लिए:

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

ऐसा नहीं है कि सत्र और कुकी भी एक OpenID रणनीति द्वारा ओवरराइट कर रहे हैं संभव है (https://github.com/liamcurry/पासपोर्ट भाप)? मैंने आपके समाधान की कोशिश की है, लेकिन कॉलबैक रूट में 'req.session.foo'' अपरिभाषित 'है। – guest459473

संबंधित मुद्दे

 संबंधित मुद्दे