2012-10-14 13 views
8

में पासपोर्ट मिडलवेयर के साथ ट्विटर प्रमाणीकरण मैं नोड.जेएस (एक्सप्रेस फ्रेमवर्क का उपयोग करके) वाली वेबसाइट विकसित कर रहा हूं। ट्विटर प्रमाणीकरण का उपयोग करने के लिए, मैं passport मॉड्यूल (http://passportjs.org) का उपयोग कर रहा हूं, और ट्विटर के लिए उनके रैपर को passport-twitter कहा जाता है।नोड

मेरे सर्वर साइड स्क्रिप्ट है:

/** 
* Module dependencies. 
*/ 

var express = require('express') 
    , routes = require('./routes') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path') 
    , passport = require('passport') 
    , keys = require('./oauth/keys') 
    , TwitterStrategy = require("passport-twitter").Strategy; 

var app = express(); 

app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser('foo')); 
    app.use(express.session()); 
    // Initialize Passport! Also use passport.session() middleware, to support 
    // persistent login sessions (recommended). 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(require('less-middleware')({ src: __dirname + '/public' })); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler()); 
}); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function (err, user) { 
    done(err, user); 
    }); 
}); 

passport.use(new TwitterStrategy({ 
    consumerKey: keys.twitterConsumerKey, 
    consumerSecret: keys.twitterConsumerSecret, 
    callbackURL: "http://local.host:3000/auth/twitter/callback" 
    }, 
    function(token, tokenSecret, profile, done) { 
    User.findOrCreate({ twitterId: profile.id }, function (err, user) { 
     if (err) { return done(err); } 
     else { return done(null, user); } 
    }); 
    } 
)); 

app.get('/', routes.index); 
app.get('/contacts', routes.contacts); 
app.get('/cv', routes.cv); 
app.get('/projects', routes.projects); 
app.get('/users', user.list); 

// Redirect the user to Twitter for authentication. 
// When complete, Twitter will redirect the user back to the 
// application at /auth/twitter/callback 
app.get('/auth/twitter', passport.authenticate('twitter')); 

// Twitter will redirect the user to this URL after approval. Finish the 
// authentication process by attempting to obtain an access token. If 
// access was granted, the user will be logged in. Otherwise, 
// authentication has failed. 
app.get('/auth/twitter/callback', 
    passport.authenticate('twitter', 
    { 
     successRedirect: '/', 
     failureRedirect: '/login' 
    } 
) 
); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 

यूआरआई लॉगइन करने के लिए जुड़े http://local.host:3000/auth/twitter है;

Express 
500 ReferenceError: User is not defined 

मैं इस समस्या को कैसे हल कर सकते हैं: जब मैं इसे पर जाते हैं, ट्विटर मुझे मेरी खुद की वेबसाइट के साथ अपना खाता जोड़ने लेकिन, इस चरण के बाद, निम्न त्रुटि तब होती है के लिए प्रमाणीकरण रूप से पता चलता? सर्वश्रेष्ठ संबंध, वीआई।

+0

वर के बजाय उपयोगकर्ता उपयोगकर्ता var:

अनिवार्य रूप से इस मिडलवेयर बनाने? – chovy

उत्तर

7

आपको अपने उपयोगकर्ता प्रकार को कहीं भी परिभाषित करना होगा। ऐसा लगता है कि आप इस बात की अपेक्षा करते हैं कि User मौजूद है और findOrCreate और findById फ़ंक्शंस रखने के लिए, लेकिन आपने कभी भी इसे कहीं भी परिभाषित नहीं किया है। आप इन उपयोगकर्ताओं को कहां ढूंढ रहे हैं? जो लोग नहीं पाए जाते हैं, वे कहां बनाए जाते हैं? क्या आप डेटाबेस का उपयोग कर रहे हैं? आप डेटाबेस से कैसे जुड़ते हैं? मुझे लगता है कि आप "मॉडल" चरण भूल गए हैं। आप Mongoose Auth जो पासपोर्ट की तरह है पर एक नज़र लेने के लिए चाहते हो सकता है, लेकिन यह Mongoose में सीधे प्लग है, जो एक Mongo डाटाबेस

+0

मुझे खेद है, मैंने वास्तव में बेवकूफ त्रुटि की है! उत्तर के लिए बहुत बहुत धन्यवाद! –

+0

साइन-इन करने पर उपयोगकर्ताओं को आपको किसी डेटाबेस की आवश्यकता क्यों होगी? यह एक "जरूरी नहीं" है। मैं अपने ऐप में किसी भी डेटाबेस का उपयोग नहीं करता, मेरे पास सहेजने के लिए कुछ भी नहीं है .. – vsync

+0

vsync आप सही हैं, आपको डेटाबेस रखने की आवश्यकता नहीं है। केवल तभी जब आप एक अनुरोध से दूसरे अनुरोध में उपयोगकर्ता की जानकारी जारी रखना चाहते हैं, तो आपको किसी प्रकार का डेटाबेस चाहिए (फाइलें, इन-मेमोरी, या उचित डेटाबेस हो सकता है)। – Max

3

यह करने के लिए connnects जब मैं एक ही त्रुटि जो User कहते हैं का सामना करना पड़ा परिभाषित नहीं है मैं क्या किया है:

passport.use(new TwitterStrategy({ 
    consumerKey: keys.twitterConsumerKey, 
    consumerSecret: keys.twitterConsumerSecret, 
    callbackURL: "http://local.host:3000/auth/twitter/callback" 
    }, 
    function(token, tokenSecret, profile, done) { 
    done(null, profile); 
    } 
)); 
+2

कृपया यह न करें, यह सुरक्षित नहीं है। आपके पास एक एकल 'उपयोगकर्ता' उदाहरण है, जिसे आपकी साइट के सभी आगंतुकों के बीच साझा किया जाता है। यह कई सुरक्षा और अभिगम नियंत्रण समस्याओं का कारण बन जाएगा। –

+0

लेकिन मेरा ऐप कहता है कि 'उपयोगकर्ता' परिभाषित नहीं है। मुझे इसे मैन्युअल रूप से परिभाषित करना है। मैंने – vsync

+0

के रास्ते से अपना उत्तर अपडेट किया है, उपयोगकर्ता कुछ ऐसा है जो आपको स्वयं को लागू करने की आवश्यकता है। यह आम तौर पर एक ओआरएम जैसे मोंगोस द्वारा प्रदान की जाने वाली कक्षा या मॉडल होता है। महत्वपूर्ण बात यह है कि आपके आवेदन के प्रत्येक उपयोगकर्ता के लिए एक अद्वितीय उदाहरण होना चाहिए। –

0

क्रैकन के पास पासपोर्ट के लिए बीट्स म्यूजिक ओएथ 2 रणनीति को एकीकृत करते समय मैं एक ही मुद्दे में भाग गया। ऐसा लगता है कि विभिन्न क्रैकन पासपोर्ट एकीकरण रणनीतियों के उदाहरण उदाहरण के लिए एक ही साधारण उदाहरण दस्तावेज़ीकरण का उपयोग करते हैं, जिसने स्पष्ट रूप से उपयोगकर्ता ऑब्जेक्ट (समझने योग्य) पर चर्चा नहीं की थी।

मुझे पता चला कि पासपोर्ट रणनीति उदाहरणों के माध्यम से खोदने से @https://github.com/krakenjs/kraken-examples/tree/master/with.passport पाया गया है) कि उपयोगकर्ता को मोंगोस मॉडल स्कीमा के आधार पर एक मॉडल बनना है और https://github.com/drudge/mongoose-findorcreate प्लगइन के साथ कॉन्फ़िगर किया गया है।

बाद में मैंने User = require('../PATH_TO/user') शामिल किया और इस प्लगइन को उपयोगकर्ता मॉडल, वॉयला में जोड़ा! कोई और गलती नहीं :)

लगता है जैसे आपको डीबी कार्यक्षमता की आवश्यकता नहीं है, इसलिए आप शायद ऑथ चेक को हटाने के साथ अच्छे हैं।

उम्मीद है कि यह किसी और के समान मुद्दों के लिए मदद करता है।

0

मुझे लगता है कि एपीआई उन मामलों के लिए तैयार नहीं है जिनके लिए उपयोगकर्ता की डीबी एकीकरण की आवश्यकता नहीं है। मेरा समाधान done() फ़ंक्शन को अनदेखा कर दिया गया था और सफलता पृष्ठ पर रीडायरेक्ट कर रहा था।

passport.use(new TwitterStrategy({ 
    consumerKey: keys.twitterConsumerKey, 
    consumerSecret: keys.twitterConsumerSecret, 
    callbackURL: "http://local.host:3000/auth/twitter/callback" 
    }, 
    function(token, tokenSecret, profile, done) { 
    //done(null, profile); 
    this.redirect('/auth/success'); 
    } 
)); 
0

आगे मैक्स की जवाब पर व्याख्या करने के लिए: "आप User बनाने की जरूरत अपने आप को"

Read Here

टी एल: डॉ - मूल रूप से आप एक userschema है कि आप उन की स्थापना की और सत्यापित करने के लिए उपयोग किया है करने के लिए है उपयोगकर्ताओं, इसे एक मोंगोस डीबी बैकएंड की आवश्यकता है, जो वास्तव में कॉन्फ़िगर करने के लिए सरल है।

var mongoose = require('mongoose'); 
var bcrypt = require('bcrypt-nodejs'); 

// define the schema for our user model 
var userSchema = mongoose.Schema({ 

    local   : { 
     email  : String, 
     password  : String, 
     group  : String, 
    }, 
    facebook   : { 
     id   : String, 
     token  : String, 
     email  : String, 
     name   : String 
    }, 
    twitter   : { 
     id   : String, 
     token  : String, 
     displayName : String, 
     username  : String 
    }, 
    google   : { 
     id   : String, 
     token  : String, 
     email  : String, 
     name   : String 
    } 

}); 

// methods ====================== 
// generating a hash 
userSchema.methods.generateHash = function(password) { 
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); 
}; 

// checking if password is valid 
userSchema.methods.validPassword = function(password) { 
    return bcrypt.compareSync(password, this.local.password); 
}; 

// create the model for users and expose it to our app 
module.exports = mongoose.model('User', userSchema);