![](/img/trans.png)
[英]undefined is not a function: unit testing passport authentication custom callback
[英]Passport authentication callback hangs
經過幾個小時試圖自己解決這個問題,我到了SO社區尋找一些亮點。
我正在使用護照進行用戶身份驗證。 它已根據文檔在我的主要express.js文件中初始化:
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);
}
});
}
));
};
這是目前發生的事情:
事情變得奇怪:
done(null,user)
不執行任何操作。 應用程序掛起回調,客戶端一直等待響應。 我嘗試過的:
passport.js
的整個設置功能(發現有些人使用它但沒有解決問題) User.findOne({...}).exec().then(user => {...})
使用帶有promise的Mongoose 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();***
}
));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.