我是Passport,用于对ExpressJS应用程序中的用户进行身份验证。我试图将所有Facebook路由放在他们自己的模块中,因为我打算支持其他OAuth提供商。在我的启动脚本中,我已经定义了所需的FB端点:
var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var facebook = require('./routes/facebook');
var login = require('./routes/login');
var http = require('http');
var path = require('path');
var app = express();
/* Configuration stuff here*/
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/login', login.index);
app.get('/auth/facebook', facebook.fb_auth);
app.get('/auth/facebook/callback', facebook.fb_callback);
正如您所看到的,我需要我的'facebook'模块,其中包含实际路线和Facebook验证回调。它看起来像这样:
var passport = require('passport')
, FacebookStrategy = require('passport-facebook').Strategy
, User = require('../services/user');
passport.use(new FacebookStrategy({
clientID: 'myclientid',
clientSecret: 'mysecretkey',
callbackURL: "http://localhost:3000/auth/facebook/callback" //localhost:3000 domain is registered domain in fb
},
function(accessToken, refreshToken, profile, done) {
console.log('verify')
User.findOrCreate(profile, function(err, user){
if(err) return done(err);
done(null, user);
});
}
));
// Redirect the user to Facebook for authentication. When complete,
// Facebook will redirect the user back to the application at
// /auth/facebook/callback
exports.fb_auth = function(req, res){
passport.authenticate('facebook')
};
// Facebook 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.
exports.fb_callback = function(req, res){
console.log('callback')
passport.authenticate('facebook', { successRedirect: '/',
failureRedirect: '/login' });
};
我可以看到(记录到stdout)调用了fb_auth但是上面定义的验证回调函数永远不会。我忽略了什么吗?在我可以捕获的某个地方是否发生错误?
谢谢!
答案 0 :(得分:8)
我在这里找到答案:Using PassportJS with Connect for NodeJS to authenticate Facebook Users
您需要显式调用'authenticate'函数并为其提供req,res和next。
exports.fb_auth = function(req, res, next){
passport.authenticate('facebook')(req, res, next);
return;
};
exports.fb_callback = function(req, res, next){
passport.authenticate('facebook', { successRedirect: '/',
failureRedirect: '/login' })(req, res, next);
};