Паспорт facebook логин: фейсбук не открывается, isAuthenticated () false - PullRequest
0 голосов
/ 03 мая 2019

В идеале на главной странице есть общая кнопка входа, которая перенаправляет на несколько кнопок входа, одна из которых предназначена для 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 - -

Это сетевой журнал:

Network log

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;

1 Ответ

0 голосов
/ 04 мая 2019

Проблема заключалась в том, что я добавлял сеанс и паспорт после своих маршрутов, когда это должно было быть до них, согласно этому ответу .

//Routes WERE 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());

//Routes SHOULD BE here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...