Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why am I unable to access req.user.username while using passport.js?

I’m using passport.js for authentication, and forgive me if my phrasing is incorrect as I’m still new to this. After logging in via google, I redirect to the profile page. However, when I send the request Object (User), only the first parameter of the object is available to me through req.user (the id). I’ll show the passport-setup, along with the routes and hopefully that should be enough information.

passport setup:

const passport = require('passport')
const GoogleStrategy = require('passport-google-oauth20')
const User = require('../models/User')
 
passport.serializeUser((user, done) => {
    done(null, user.id) 
})

passport.deserializeUser((id, done) => {
    User.findById(id).then((user) => {
        done(null, user.id) 
    })
})

passport.use(
    new GoogleStrategy({
    // options for the google strat
    callbackURL: '/auth/google/redirect',
    clientID: process.env.clientID,
    clientSecret: process.env.clientSecret
}, (accessToken, refreshToken, profile, done) => {
    // passport callback function

    User.findOne({googleId:profile.id}).then((currentUser) => {
        if(currentUser){
        // already have a user
        console.log('user is: ' + currentUser)
        done(null, currentUser)
        } else {
            // if not, create user in db
            new User({
            username: profile.displayName,
            googleId: profile.id
        }).save().then((newUser) => {
            console.log('new user created' + newUser)
            done(null, newUser)
        })
    }
        
})

}))

auth route:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

const express = require('express')
const router = express.Router()
const passport = require('passport')

// auth login
router.get('/login', (req, res) => {
    res.render('login')
})

// auth logout
router.get('/logout', (req, res) => {
    // handle the passport
    res.send('logging out')
})

// auth with google
router.get('/google', passport.authenticate('google', {
    scope: ['profile']
}));

// callback route for google to redirect to
router.get('/google/redirect', passport.authenticate('google'), (req, res) => {
    // res.send(req.user)
    res.redirect('/profile')
})

module.exports = router

If I type res.user.username within the last route, I get my username. But when I send the request to the redirect, req.user.username returns undefined, while req.user gives me the first parameter, which is the id. Looks something like this.

welcome 63638beb83e373e1acc7914c

Lastly, here is my profile route:

const router = require('express').Router()

router.get('/', (req, res) => {
    // req.user.username returns undefined
    res.send('this is your profile, welcome ' + req.user)
})

module.exports = router

And Schema incase it’s needed:

const mongoose = require('mongoose')
const Schema = mongoose.Schema

const userSchema = new Schema({
    username: String,
    googleId: String
})

const User = mongoose.model("user", userSchema)

module.exports= User;

Any help is much appreciated!

>Solution :

You should return entire user object here

passport.deserializeUser((id, done) => {
    User.findById(id).then((user) => {
        done(null, user) 
    })
})
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading