failed to fetch data in the passport google oauth20

17 Views Asked by At

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)
0

There are 0 best solutions below