node.jsexpresspassport.jspassport-local

Update logged in user details in session


I am using PassportJS with ExpressJS.

I need to update the logged in user details. While I do update this in the DB, how do I update it in the session too so that request.user contains the updated user details?

That is, after updating the database, how do I update the session info on the user as well?

I tried directly assigning the updated details to request.user but it did not work. I then tried request.session.passport.user - this worked but there is a delay of around 5 to 10 seconds before it gets updated in request.user too.

Is there a function that I need to call that updates the user information stored in the session? Or is there some other object that I can update where the change does not have a delay


Solution

  • I've been hunting down an answer for this too. Never mentioned in any docs or tutorials!

    What seems to work is, after saving your newly updated user, do req.login(user)...

    // "user" is the user with newly updated info
    user.save(function(err) {
        if (err) return next(err)
        // What's happening in passport's session? Check a specific field...
        console.log("Before relogin: "+req.session.passport.user.changedField)
        
        req.login(user, function(err) {
            if (err) return next(err)
            
            console.log("After relogin: "+req.session.passport.user.changedField)
            res.send(200)
        })
    })
    

    The clue was here... https://github.com/jaredhanson/passport/issues/208



    EDIT 2023

    Apparently, since passport@0.6.0, req.login() now generates a new session ID, which means this approach may no longer work. Stick to the previous version (0.5.3) for now? Here's a tiny bit more detail .