jaredhanson / passport-facebook

Facebook authentication strategy for Passport and Node.js.
https://www.passportjs.org/packages/passport-facebook/?utm_source=github&utm_medium=referral&utm_campaign=passport-facebook&utm_content=about
MIT License
1.3k stars 446 forks source link

Facebook callback URL always return Error 500 on Express #243

Open engalexandre opened 6 years ago

engalexandre commented 6 years ago

Seems like theres something wrong with either Passport/FB Strategy or the way I used to separate my routes.

My callback returns a "sucessfull" 500. Also, Facebook now requires that even on dev mode we run a SSL server, so heres my attempt (some parts ommited for brevity):

//index.js

var fs = require('fs');
var https = require('https');
var express = require('express');
var cors = require('cors');
var privateKey  = fs.readFileSync('./dev/key.pem', 'utf8');
var certificate = fs.readFileSync('./dev/cert.pem', 'utf8');
var passport = require('passport');
var passportconf = require('./passportconf');
var Strategy = require('passport-facebook').Strategy;
// Create a new Express application.
var app = express();

// enable cors
var corsOption = {
  origin: true,
  methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
  credentials: true,
  exposedHeaders: ['x-auth-token']
};
app.use(cors(corsOption));

// Use application-level middleware for common functionality, including
// logging, parsing, and session handling.
app.use(require('morgan')('combined'));
app.use(require('cookie-parser')());
app.use(require('body-parser').urlencoded({ extended: true }));
app.use(require('express-session')({ secret: 'keyboardcat', resave: true, saveUninitialized: true }));

// Initialize Passport and restore authentication state, if any, from the
// session.
app.use(passport.initialize());
app.use(passport.session());
//My routes are separated for better maintenance
app.use('/manufacturer', require('./routes/manufacturer'));
app.use('/user', require('./routes/user'));

// Define routes.

app.get('/',
  function(req, res) {
    res.json('hi');
  });
app.get('/healthcheck',
  function(req, res) {
    res.status(200)
        .send('OK');
  });
app.use(function(req, res) {
    res.status(404);
    url = req.url;
    res.status(404).json({title: '404: File Not Found', url: url });
});

      // Handle 500
app.use(function(error, req, res, next) {
    res.status(500);
    url = req.url;
    res.status('500').json({title:'500: Internal Server Error', error: error});
});
https.createServer({
    key: privateKey,
    cert: certificate
}, app).listen(3000);

//passportconf.js

var passport = require('passport');
var Strategy = require('passport-facebook').Strategy;
var User = require('./models').User;
passport.use(new Strategy({
    clientID: '***',
    clientSecret: '***',
    callbackURL: 'https://localhost:3000/user/login/facebook/return',
    profileFields: ['id', 'displayName', 'emails']
  },
  function(accessToken, refreshToken, profile, cb) {
    process.nextTick(function () {
      User.upsert(accessToken, profile, function(user, created) {
          return cb(user, created);
      });
    });
  }));
  passport.serializeUser(function(user, done) {
    done(null, user);
  });

  passport.deserializeUser(function(obj, done) {
    done(null, obj);
  });
  exports.ensureAuthenticated = function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated()) { return next(); }
    res.redirect('/user/login');
  }

//manufacturer.js

var express = require('express');
var router = express.Router();
var Manufacturer = require('../models').Manufacturer;
var passportconf = require('../passportconf');

router.get('/:id', passportconf.ensureAuthenticated, function(req, res) {
    console.log(req.user);
    //console.log(req);
    res.status(200).send(req.params.id + 'auth');
});
module.exports = router;

//user.js (routes for authenticating)

var express = require('express');
var router = express.Router();
var passportconfig = require('../passportconf');
var passport = require('passport');
var Strategy = require('passport-facebook').Strategy;

router.get('/login',
  function(req, res){
    res.redirect('/user/login/facebook');
  });

router.get('/login/facebook',
  passport.authenticate('facebook'));

router.get('/login/facebook/return', 
  passport.authorize('facebook', { successRedirect : '/', failureRedirect: '/error' }),
  function(req, res) {
    console.log('eita jao');
    res.redirect('/');
  });
module.exports = router;

If i try: https://localhost:3000/manufacturer/1, I get a 'sucessfull' callback with my profile data and stuff, but for some reason, im getting error 500, returning this: {"title":"500: Internal Server Error","error":{"id":4,"facebookid":xxxxxx,"name":"xx xx","token":"Big token ommited for brevity","email":"whatever@dotcom.com","userprovider_id":1}}

userprovider_id is a custom field of my database.

Anyone is having a similar problem?

OvErit1971 commented 5 years ago

I would like to thank everyone who doesn't know me but my family and Scott's ,really...I am in disbelief right now and sadden by what I have been reading the last few days trying to safeguard my accounts to find out it was Family.