在Node中使用Passport中间件进行Twitter身份验证

8 twitter oauth node.js express passport-twitter

我正在使用Node.js开发一个网站(使用Express框架).为了使用Twitter身份验证,我使用passport模块(http://passportjs.org),并将他的Twitter包装器称为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'));
});
Run Code Online (Sandbox Code Playgroud)

与登录相关的URI是http://local.host:3000/auth/twitter; 当我访问它时,Twitter向我显示了将我的帐户与我自己的网站链接的身份验证表单,但是在此步骤之后,出现以下错误:

Express
500 ReferenceError: User is not defined
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?最好的问候,Vi.

Max*_*Max 7

您必须在某处定义用户类型.它看起来像你期望这个东西User存在,并有功能findOrCreatefindById,但你永远不定义任何地方.你在哪里"找到"这些用户?那些没有找到的,他们在哪里"被创造"?你在使用数据库吗?你如何连接到数据库?我想你忘了"模特"一步.您可能想看看像Passport一样的Mongoose Auth,但它直接插入Mongoose,它与Mongo数据库连接