护照身份验证回调挂起
Passport authentication callback hangs
几个小时后,我试图自己解决这个问题,我来到SO社区寻找一些光明。
我使用护照进行用户身份验证。它已经在我的主express.js文件中初始化了,按照docs:
app.use(passport.initialize());
我得到了一个index.js文件,以这种方式处理facebook-passport
:Index.js
'use strict';
import express from 'express';
import passport from 'passport';
import auth from '../auth.service';
let router = express.Router();
//this function is defined in the auth.service import but copied it here in case it's needed (the `signToken` is also defined in the service)
function setTokenCookie(req, res) {
if (!req.user) return res.json(404, { message: 'Something went wrong, please try again.'});
var token = signToken(req.user._id, req.user.role);
res.cookie('token', JSON.stringify(token));
res.redirect('/');
}
router
.get('/', passport.authenticate('facebook', {
scope: ['email', 'user_about_me'],
failureRedirect: '/login'
}))
.get('/callback', passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/login'
}), setTokenCookie);
module.exports = router;
以及在index.js中以这种方式导入的passport.js:
passport.js
import passport from 'passport';
import {
Strategy as FacebookStrategy
}
from 'passport-facebook';
exports.setup = function(User, config) {
passport.use(new FacebookStrategy({
clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret,
callbackURL: config.facebook.callbackURL
},
function(accessToken, refreshToken, profile, done) {
User.findOne({
'facebook.id': profile.id
}, (findErr, user) => {
if (findErr) {
return done(findErr);
}
if (!user) {
let userToSave = new User({
name: profile.displayName,
email: profile.emails[0].value,
role: 'user',
username: profile.username,
provider: 'facebook',
facebook: profile._json
});
userToSave.save((saveErr) => {
if (saveErr) done(saveErr);
return done(null, user);
});
} else {
return done(null, user);
}
});
}
));
};
这是当前发生的:
- 提示Facebook登录
- 在Facebook中验证成功后,回调(/auth/Facebook/callback)与预期的用户信息和令牌到达。
- 用户被保存在DB中,并带有预期的字段
奇怪的地方:
- 保存用户后,
done(null,user)
不做任何操作。应用挂起回调,客户端继续等待响应。 - 中间件setTokenCookie永远不会被调用,所以问题肯定在前一步。
我试过了:
- 将
passport.js
的整个设置函数封装在一个进程中。 - 使用猫鼬与
User.findOne({...}).exec().then(user => {...})
的承诺
如果你需要更多的信息,请不要犹豫,尽管问。非常感谢您的帮助。
谢谢!
我在浏览代码时发现了一些可能缺失的部分。您是否使用passport.session()
中间件?还有serializeUser
和deserializeUser
功能?
passport.serializeUser(function(user, done) {
//place user's id in cookie
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
//retrieve user from database by id
User.findById(id, function(err, user) {
done(err, user);
});
});
如果你像我一样是护照/快递的新手,这可能会有所帮助:
检查是否在护照逻辑中调用了done():
passport.use(new twitchStrategy({
clientID: config.twitchID,
clientSecret: config.twitchSecret,
/*to be updated*/
callbackURL: config.callbackURL,
scope: "user_read"
},
function(accessToken, refreshToken, profile, done) {
console.log(profile);
***return done();***
}
));
相关文章:
- Javascript点击事件回调不起作用
- STOMP web套接字回调不'不起作用
- Angular Js 尝试从主按钮回调动态更改模态文本并且不起作用
- 为什么JavaScript中没有挂起回调函数
- socket.io回调函数不起作用
- 如果我移除animateTo参数,.remove()回调函数将不起作用
- 构建Ajax调用数组时,JQueryAjax成功回调不起作用
- 挂起的回调:在每次回调返回之前返回响应
- Javascript中的AJAX-命名回调;不起作用
- JQuery Smart Spinner:回调属性不起作用
- 类似FaceBook的按钮回调不起作用
- jQuery地址在回调中不起作用
- 回调事件不起作用-使用猫头鹰旋转木马
- spawn() 函数的“关闭”回调在 grunt 插件中不起作用
- Javascript回调函数不起作用
- 使用回调的递归Javascript函数不起作用
- 从回调中调用函数会导致节点应用挂起
- 猫鼬查询在回调后挂起
- 护照身份验证回调挂起
- 在promise挂起时延迟执行的回调函数