В идеале на главной странице есть общая кнопка входа, которая перенаправляет на несколько кнопок входа, одна из которых предназначена для Facebook.Пользователь нажимает эту кнопку и, если он прошел проверку подлинности, перенаправляется на /my-reptiles/
.
Однако на самом деле происходит следующее: когда пользователь нажимает кнопку «Войти через Facebook», ему не выдается подтверждение от Facebookи немедленно перенаправляются обратно на домашнюю страницу из метода ensureAuthenticated()
в my-reptiles.js
.При работе в режиме приватного просмотра меня просят войти в Facebook перед перенаправлением, но меня не просят одобрить использование Facebook в качестве метода входа.Это нормально?
Кроме того, локальная запись mongodb для пользователя все еще создается, даже если isAuthenticated()
не удается.
На консоли разработчика Facebook у меня установлены домены приложений localhost
и сайтURL установлен на http://localhost:3000/
.
Это вывод консоли:
GET /auth/facebook 302 4.309 ms - 0
GET /auth/facebook/callback?code=LONG_CODE_HERE 302 215.462 ms - 68
Unauthenticated request!
GET /my-reptiles 302 0.879 ms - 46
GET / 304 14.854 ms - -
Это сетевой журнал:
my-reptiles.js
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
} else {
console.log("Unauthenticated request!");
res.redirect('/');
}
}
router.get('/', ensureAuthenticated, function(req, res, next) {
//Do stuff
});
module.exports = router;
app.js
//Requires here
function findOrCreate(key, cb) {
db.collection('users').findOne(key, (err, user) => {
if (err) {
console.error(err);
} else {
if (!user) {
db.collection("users").insert(key, cb)
} else {
cb(err, user);
}
db.close();
}
});
}
// config
passport.use(new FacebookStrategy(
{
clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret,
callbackURL: config.facebook.callbackURL
},
function(accessToken, refreshToken, profile, done) {
findOrCreate({
auth: "facebook",
id: profile.id
}, function (err, user) {
return done(err, user);
});
}
));
var app = express();
//View engine setup here
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({
extended: false
}));
app.use(cookieParser('sekret'));
app.use(express.static(path.join(__dirname, 'public')));
//Routes here
const cookieExpirationDate = new Date();
const cookieExpirationDays = 365;
cookieExpirationDate.setDate(cookieExpirationDate.getDate() + cookieExpirationDays);
app.use(session({
secret: 'sekret',
saveUninitialized: true,
resave: true
}));
app.use(passport.initialize());
app.use(passport.session());
app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback',
passport.authenticate('facebook', {
successRedirect: '/my-reptiles',
failureRedirect: '/'
})
);
app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
//Error handling here
module.exports = app;