I have a local strategy and a Google strategy, it's in a different file and has different serialize and deserialize, because they have different Mongo database, my login with Google successfully happen, and the data is saved in the Mongo, whenever I try to get the user data from the login/success that is req.user. It shows the error in the front end and the user shows null.
import dotenv from 'dotenv'
import passport from 'passport'
import { Strategy as GoogleStrategy } from 'passport-google-oauth20'
import Usergoogle from '../dataBase/modal/googleuserModels.js'
dotenv.config()
passport.use(
new GoogleStrategy(
{
clientID: `${process.env.CLIENT_ID}`,
clientSecret: `${process.env.CLIENT_SECRET}`,
callbackURL: '/auth/google/callback',
scope: ['profile', 'email'],
},
async (_accessToken, _refreshToken, profile, done) => {
const user = await Usergoogle.findOne({
googleId: profile.id,
})
if (!user) {
const newUser = await Usergoogle.create({
name: profile.displayName,
email: profile.emails[0].value,
pic: profile.photos[0].value,
googleId: profile.id,
})
if (newUser) {
done(null, newUser)
}
} else {
done(null, user)
}
},
),
)
passport.serializeUser((user, done) => {
done(null, user._id)
})
passport.deserializeUser((_id, done) => {
const user = Usergoogle.findById(_id)
if (user) {
done(null, user)
} else {
console.log('no user os found')
done(null, false)
}
})
const checkAunthenticated = (req, res, next) => {
if (req.isAuthenticated()) {
return next()
} else res.send('is not authenticated')
}
grouter.get('/login/success', checkAunthenticated, (req, res) => {
if (req.user) {
console.log(req.user)
res.status(200).json({
error: false,
message: 'Successfully Loged In',
user: req.user,
})
} else {
res.status(403).json({ error: true, message: 'Not Authorized' })
}
})
grouter.get('/login/failed', (req, res) => {
res.status(401).json({
error: true,
message: 'Log in failure',
})
})
// STEP 1 -- making get request
grouter.get('/google', passport.authenticate('google', ['profile', 'email']))
// STEP 3 - doing something once get authenticated
// if success or error we run callback
grouter.get(
'/google/callback',
passport.authenticate('google', {
successRedirect: process.env.CLIENT_URL,
failureRedirect: '/login/failed',
}),
)
const [user, setUser] = useState(null)
const getUser = async () => {
try {
const url = 'http://localhost:5000/auth/login/success'
const { data } = await axios.get(url, { withCredentials: true })
console.log('User data received:', data.user) // Debugging: log the received data
setUser(data.user)
} catch (err) {
console.log('Error fetching user data:', err)
}
}
useEffect(() => {
getUser()
}, [])
console.log('user', user)