使用 Passport 和 ExpressJS 进行 Facebook 身份验证 - 为啥不调用验证回调?
Posted
技术标签:
【中文标题】使用 Passport 和 ExpressJS 进行 Facebook 身份验证 - 为啥不调用验证回调?【英文标题】:Facebook Authentication with Passport and ExpressJS - Why is verify callback not called?使用 Passport 和 ExpressJS 进行 Facebook 身份验证 - 为什么不调用验证回调? 【发布时间】:2013-10-30 17:41:47 【问题描述】:我是 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' );
;
我可以看到(记录到标准输出)调用了 fb_auth,但上面定义的验证回调函数从未调用过。我忽略了什么吗?我可以捕获的地方是否发生了错误?
谢谢!
【问题讨论】:
【参考方案1】:我在这里找到了答案: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);
;
【讨论】:
passport.authenticate 是中间件。您可以将其简化为直接导出:exports.fb_auth = passport.authenticate('facebook');
和回调类似。
@JaredHanson 好电话。谢谢。以上是关于使用 Passport 和 ExpressJS 进行 Facebook 身份验证 - 为啥不调用验证回调?的主要内容,如果未能解决你的问题,请参考以下文章
尝试获取资源 Passport ReactJS 和 ExpressJS 时出现 NetworkError:CORS
req.session.passport 为空,未调用 deserializeUser - ExpressJS,Passport
Passport AngularJS ExpressJS:Access-Control-Allow-Origin 不允许 Origin null
使用 express js、passport s 保护 GraphQL 查询