register nodejs node example node.js twitter oauth express passport-twitter

node.js - nodejs - Autenticación de Twitter con middleware Passport en Node



passport js node (5)

Estoy desarrollando un sitio web con Node.js (usando Express framework). Para usar la autenticación de Twitter, estoy usando el módulo de passport (http://passportjs.org) y su contenedor para Twitter llamado passport-twitter .

Mi script del lado del servidor es:

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

El URI asociado al inicio de sesión es http://local.host:3000/auth/twitter ; cuando lo visito, Twitter me muestra el formulario de autenticación para vincular mi cuenta con mi propio sitio web pero, después de este paso, aparece el siguiente error:

Express 500 ReferenceError: User is not defined

¿Como puedó resolver esté problema? Saludos cordiales, Vi.


Debes definir tu tipo de Usuario en alguna parte. Parece que esperas que este User exista y que tenga las funciones findOrCreate y findById , pero nunca lo findById ninguna parte. ¿Dónde estás "buscando" a estos usuarios? Los que no se encuentran, ¿dónde están siendo ''creados''? ¿Estás usando una base de datos? ¿Cómo te conectas a la base de datos? Creo que olvidaste el paso "Modelo". Es posible que desee echar un vistazo a Mongoose Auth, que es como Pasaporte, pero se conecta directamente a Mongoose , que se conecta a una base de datos de Mongo.


Esto es lo que hice cuando me enfrenté al mismo error que dice que el User no está definido:

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); } ));


Me encontré con el mismo problema al integrar la estrategia BeatsMusic OAuth2 para Passport dentro de Kraken. Parece que los ejemplos de las diversas estrategias de integración de Kraken Passport utilizan la misma documentación de ejemplo simple que no discutía explícitamente el objeto User (comprensible).

Descubrí (a partir de los ejemplos de estrategia de pasaporte encontrados en https://github.com/krakenjs/kraken-examples/tree/master/with.passport ) que el usuario debe ser un modelo basado en el esquema del modelo Mongoose y también está configurado con el https://github.com/drudge/mongoose-findorcreate plugin.

Después de incluir el User = require(''../PATH_TO/user'') y agregué este complemento al modelo de usuario, ¡voilá! no más errores :)

Parece que no necesitas la funcionalidad DB, por lo que probablemente seas bueno eliminando la verificación de autenticación.

Espero que esto ayude a cualquier persona que tenga problemas similares.


Creo que la API no está lista para los casos que no necesitan la integración de db del usuario. Mi solución fue ignorar la función done() y hacer un redireccionamiento a la página de éxito.

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


Para explicar mejor la respuesta de Max: "Necesitas crear tu mismo"

Leer aquí

TL: DR: básicamente, debe tener un usuariochema que use para configurar usuarios y verificar usuarios, necesita un backend db mongoose, que en realidad es simple de configurar.

esencialmente creando este 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);