Я пытаюсь интегрировать паспорт на свой сервер nodejs, используя connect, но не могу сделать это правильно. Все руководства/примеры используют expressJS, поэтому я изо всех сил старался переформатировать код для работы с моим кодом, но я не могу заставить его работать. Связанные части написаны ниже. Есть ли у кого-нибудь советы о том, что может быть проблемой? passport.authenticate() никогда не кажется вызванным (по крайней мере, сообщение console.log в обратном вызове аутентификации facebook никогда не печатается). В настоящее время я ничего не сохраняю в базе данных, поэтому проблема, надеюсь, будет чем-то действительно простым, что я просто не вижу.Использование PassportJS с Connect для NodeJS для аутентификации пользователей Facebook
Единственное, что приходит на ум - это потенциальный обратный вызов, который у меня есть для facebook, который является URL-адресом localhost (так как я все еще разрабатываю это локально). Я смог аутентифицироваться с помощью facebook просто отлично, используя everyauth (из чисто локального экземпляра), но переключился на паспортный код, так как у меня были разные проблемы, которые, по-видимому, обращались в паспорт.
passport = require('passport');
fpass = require('passport-facebook').Strategy;
passport.serializeUser(function(user,done){
done(null, user);
});
passport.deserializeUser(function(obj,done){
done(null,obj);
});
passport.use(new fpass({
clientID:'facebook app id',
clientSecret:'facebook app secret',
callbackURL:'http://localhost:3000/auth/facebook/callback'
},
function(accessToken, refreshToken, fbUserData, done){
console.log('got here');
return done(null,fbUserData);
}
));
function checkLoggedIn(req, res, next){
console.log("req.user: " + req.user);
if(req.user)
next();
else{
console.log('\nNot LOGGED IN\n');
if(req.socket.remoteAddress || req.socket.socket.remoteAddress == '127.0.0.1'){
var folder,contentType;
console.log('req url = '+req.url);
if(req.url == '/'){
folder = __dirname + '/landingPage.html';
contentType = 'text/html';
}
else if(req.url == '/auth/facebook'){
passport.authenticate('facebook');
return;
}
else if(req.url == '/auth/facebook/callback'){
passport.authenticate('facebook', {failureRedirect: '/failbook', successRedirect:'/'});
return;
}
if(folder){
console.log('got to folder part\n\n');
fs.readFile(folder, function(error, content){
if(error){
res.writeHead(500);
res.end();
}
else{
res.writeHead(200, {'Content-Type': contentType});
res.end(content);
}
});
}
else{ res.writeHead(500); res.end();}
}
else {res.writeHead(500); res.end();}
}
}
connect.createServer(
connect.cookieParser(),
connect.bodyParser(),
connect.session({secret:'wakajakamadaka'}),
passport.initialize(),
passport.session(),
checkLoggedIn).listen(8888);
console.log('Server has started.');
}
Есть ли у кого-нибудь какие-либо советы или есть сбой в том, что я делаю? Мои другие две альтернативы возвращаются к everyauth и выясняют, что там происходит, или переключаясь на ExpressJS, но я бы не пошел ни с одним из этих вариантов.
Бест
Сами
Хмм я добираюсь дальше, чем раньше, но пока не совсем работает. теперь я регистрирую обратный вызов из facebook. Я проверяю '/ auth/facebook/callback' на req.url.split ('?') [0] сейчас, чтобы обратный вызов регистрировался. добавление (req, res, next) после вызова функции вызывает бесконечный цикл переадресации. есть идеи? – thisissami
Я думаю, вам нужно использовать промежуточное программное обеспечение 'connect.query()' в настройке промежуточного программного обеспечения 'createServer'. Паспорт ожидает, что 'req.query' будет заполнен во многих случаях, включая получение кода авторизации в обратном вызове Facebook. –
почти там ... с добавлением '(req, res, next)', добавленным в конец вызова аутентификации обратного вызова, функция ответа на facebook достигается с использованием соответствующих данных в facebook. Тем не менее, я получаю 'TypeError: Object # не имеет метода 'redirect''. Оскорбительной строкой кода является 'return res.redirect (options.successRedirect);' в строке 97 authenticate.js. Любая идея, что может быть проблемой? –
thisissami