Twitter Authentication with Passport Middleware in Node

I am developing a website with Node.js (using the Express framework). To use Twitter authentication, I use the passport module (http://passportjs.org) and its Twitter cover called passport-twitter .

My server side script:

 /** * 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')); }); 

Login URI, http: http://local.host:3000/auth/twitter ; when I visit it, Twitter shows me an authentication form to link my account with my own site, but after this step the following error occurs:

 Express 500 ReferenceError: User is not defined 

How can I solve this problem? Regards, Vi.

+8
oauth twitter express passport-twitter
source share
5 answers

You must determine your user type somewhere. It looks like you expect this User thing to exist and have findOrCreate and findById , but you never defined it anywhere. Where do you find these users? Those not found, where are they "created"? Do you use a database? How do you connect to the database? I think you forgot the "Model" step. You can take a look at Mongoose Auth , which is similar to Passport, but it connects directly to Mongoose ., Which connects to the Mongo database

+7
source share

This is what I did when I came across the same error saying that User not defined:

 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); } )); 
+3
source share

I encountered the same problem when integrating the BeatsMusic OAuth2 strategy for Passport into Kraken. It seems that the examples for the various Kraken Passport integration strategies use the same simple sample documentation that did not explicitly discuss the User object (understandable).

I realized (from digging through passport strategy examples found @ https://github.com/krakenjs/kraken-examples/tree/master/with.passport ) that the User must be a model based on the Mongoose model diagram, and also configured with using the https://github.com/drudge/mongoose-findorcreate plugin.

After I included User = require('../PATH_TO/user') and added this plugin to the User model, voila! more mistakes :)

It doesn't seem like you need the DB functionality, so you are probably good at removing authentication.

Hope this helps for anyone who has similar problems.

0
source share

I think the api is not ready for cases that do not need db user integration. My solution ignored the done() function and redirected the success page.

 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
source share

To further explain Max Max: โ€œYou need to create a User yourselfโ€

Read here

TL: DR. Basically, you should have a custom scheme that you use to install users and verify users, this requires the db mongoose firewall, which is actually easy to configure.

essentially creating this middleware:

 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); 
0
source share

All Articles