todos-express-facebook icon indicating copy to clipboard operation
todos-express-facebook copied to clipboard

Logging a user out

Open jBachalo opened this issue 8 years ago • 8 comments

Hi How do you log a user out? On subsequent get requests to the server the previous user seems to remain logged in.

jBachalo avatar Mar 11 '16 23:03 jBachalo

Inside profile.ejs, add the following line:

<p><a href="/logout">Logout</a></p>

Then go to server.js and add a logout route:

app.get('/logout', function(req, res) {
        req.logout(); 
        res.redirect('/');
    });

From what I tried, passport takes care of the entire authentication process in the background so you can just call req.logout(). You can redirect to whatever page you want the user to go after logging out.

rajojon23 avatar Mar 19 '16 23:03 rajojon23

@rajojon23 Good work!

Hope @passport can add this sample to file.

fbukevin avatar Apr 08 '16 03:04 fbukevin

this doesn't seem to work any more. Can anyone else confirm?

jBachalo avatar Jun 08 '16 21:06 jBachalo

Hi, @jBachalo! @rajojon23 's answer is work for me. But I packaged server.js into a router (routers/passport.js).

This is what my app.js looks like:

var express = require('express')
    , passport = require('passport');

var fb = require('./routers/passport')(passport);

app.use(passport.initialize());
app.use(passport.session());

app.use('/fb', fb);

and the routers/passport.js

var express = require('express');
var router = express.Router();
module.exports = router;

module.exports = function(passport){

  var Strategy = require('passport-facebook').Strategy;

  passport.use(new Strategy({
      clientID: process.env.CLIENT_ID,
      clientSecret: process.env.CLIENT_SECRET,
      callbackURL: '...',  
    },
    function(accessToken, refreshToken, profile, cb) {
      return cb(null, profile);
    }));


  passport.serializeUser(function(user, cb) {
    cb(null, user);
  });

  passport.deserializeUser(function(obj, cb) {
    cb(null, obj);
  });


  router.get('/login', passport.authenticate('facebook', {}), 
    function(req, res) {
      /*  seems not be executed  */
    });

  // callback
  router.get('/return', passport.authenticate('facebook', {failureRedirect: '/'}),
    function(req, res){
        ...
  });

  router.get('/logout', function(req, res) {
      req.logout(); 
      res.redirect('/');
    });

  return router;
}

The profile.ejs content is the same as he said.

fbukevin avatar Jun 13 '16 08:06 fbukevin

@fbukevin I presume the passprt.serializeUser is a singleton? so if you had multiple routes that were similar to this? eg, facebook/google/blarblar then which ever is called last would have the serializeUser function ??

also, I presume require(./routes/passport_facebook) is meant to be ./routers/passport ?? or have i understood something incorrectly?

WORMSS avatar Sep 30 '16 08:09 WORMSS

@WORMSS Yap, you're right. There is a typo of required file name. ./routes/passport_facebook in app.js should be ./routers/passport. I fixed it. Thanks!

fbukevin avatar Oct 05 '16 07:10 fbukevin

How to log a user out? On subsequent get requests to the server the previous user seems to remain logged in. if the next person wants to login , i have to forcibly logout from facebook then let the next person login to my app

mitalimn avatar Mar 24 '17 18:03 mitalimn

Use express session and in the logout route destroy the session

cryskram avatar Aug 20 '21 17:08 cryskram