Passport facebook doesn't create new user and times out

158 Views Asked by At

I'm using passport with multiple strategies (JWT, Google and Facebook). All work fine except Facebook, when an existing user tries to login. In this case it just times out and I get a 504.

It tries to call https://api.example.com/users/facebook/callback/?code=... before I get the timeout error.

I tried the exact same logic from my Google strategy, where everything works fine, but it doesn't help. I tried different online tutorials but none of them worked either.

So what am I doing wrong?

Passport.js config - Facebook code block

function(passport) {

  passport.serializeUser((user, cb) => {
    cb(null, user);
  });
  
  passport.deserializeUser((user, cb) => {
    cb(null, user);
  });

  passport.use(new FacebookStrategy({
    proxy: true,
    clientID: keys.facebook.clientID,
    clientSecret: keys.facebook.clientSecret,
    callbackURL: "https://api.example.com/users/facebook/callback",
    profileFields: ['id', 'displayName', 'email']
  },
  async (accessToken, refreshToken, profile, done) => {

    const { email, first_name } = profile._json;

    try {
      const oldUser = await User.findOne({ email: email });

      if (oldUser) {
        return done(null, oldUser);
      }
    } catch (err) {
      console.log(err);
      return done(null, false);
    }

    // register user
    try {
      const newUser = await new User({
        facebook: true,
        email: email,
        name: first_name,
        verified: true,
      }).save();

      done(null, newUser);
    } catch (err) {
      console.log(err);
      return done(null, false);
    }
}
))
}

User auth route

// FACEBOOK
router.get("/facebook", passport.authenticate("facebook"));

router.get("/facebook/callback", generalTooManyRequests, passport.authenticate("facebook"), (req, res) => {
  const referer = req.cookies["Origin"]
  let redirectURL

  // login did NOT work!
  if (!req.user) {
    redirectURL = "https://app.example.com/login/fehler-facebook"
    if (referer === "website") {
      redirectURL = "https://example.com/login/?fehler-facebook"
    }
    res.redirect(redirectURL)
  } 
  // login did work!
  else {
    redirectURL = "https://app.example.com/callback/token="
    if (referer === "website") {
      redirectURL = "https://example.com/callback/?token="
    }

    const tokenObject = utils.issueJWT(req.user);
    res.redirect(redirectURL + tokenObject.token)
  }
});
0

There are 0 best solutions below