在nodejs中使用twitter oauth时,无法获得/ auth / twitter / callback

我正在尝试使用passportjs在nodejs中执行twitter oauth,但却出现错误

Cannot GET /auth/twitter/callback?oauth_token=alksdkalsjdsjd23232378skjdfjsdhf&oauth_verifier=234jjh23j4k234k23h4j2h342k34hj 

这是我的节点js代码

  var express = require('express') , passport = require('passport') , util = require('util') , GoogleStrategy = require('passport-google').Strategy , TwitterStrategy = require('passport-twitter').Strategy; passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done) { done(null, obj); }); passport.use(new TwitterStrategy({ consumerKey: 'xxxxxxxxxxxxxxxxxxxx', consumerSecret: 'xxxxxxxxxxxxxxxxxxxxxxxxxx', callbackURL: 'http://127.0.0.1:3000/auth/twitter/callback' }, function(token, tokenSecret, profile, done) { process.nextTick(function () { return done(null, profile); }); } )); var app = express(); // configure Express app.configure(function() { app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(express.logger()); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.session({ secret: 'keyboard cat' })); // 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(express.static(__dirname + '/../../public')); }); app.get('/', function(req, res){ res.render('index', { user: req.user }); }); app.get('/login', function(req, res){ res.sendfile('./views/auth.html'); }); app.get('/auth/twitter', passport.authenticate('twitter')); app.get('auth/twitter/callback', passport.authenticate('twitter', { successRedirect: '/success', failureRedirect: '/login' })); app.get('/success', function(req, res){ res.send("success logged in"); }); app.listen(process.env.PORT || 3000); 

编辑缺less/auth/twitter/callback路线定义。

另外对于路由器/auth/twitterauth/twitter/callbackpassport.authenticate()作为中间件将执行身份validation,并且您应该具有路由处理function。

所以你的路线的定义应该如下所示:

 app.get('/auth/twitter', passport.authenticate('twitter'), function(req, res) {}); // empty route handler function, it won't be triggered app.get('/auth/twitter/callback', passport.authenticate('twitter', { successRedirect: '/success', failureRedirect: '/login' }), function(req, res) {}); // route handler 

你不需要空的路由处理function(req, res) {} – 你可以把参数留出来,expression会理解你不打算使用处理程序