如何在 google 登录 nodejs 后创建 jwt 令牌

How to create jwt token after google login in nodejs

我在这里尝试使用 google 登录并在登录后将 jwt 令牌保存到数据库以及浏览器中。我能够将令牌保存到数据库,但无法在浏览器上保存令牌。 我该怎么做?

我在这里尝试使用 google 登录并在登录后将 jwt 令牌保存到数据库以及浏览器中。我能够将令牌保存到数据库,但无法在浏览器上保存令牌。 我该怎么做?

// Google login
passport.use(new GoogleStrategy({
clientID: "1089485782592-hlltndeg9aikjoarh52m2s7jcpi15of4.apps.googleusercontent.com",
clientSecret: "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",  
callbackURL: "http://localhost:3300/auth/google/callback",
passReqToCallback: true
}, 
async function(request, accessToken, refreshToken, profile, done, req, res) {
try {
// console.log(request);
// console.log(accessToken);
// console.log(refreshToken);
// console.log(profile);
// const id = profile.id;

  // console.log(profile.emails[0].value);
   registerEmail = profile.emails[0].value;
  // req.session.profileEmail = registerEmail;
  const registerName  = profile.name.givenName;
  const registerUsername = profile.id;
  const registerContactno = "1234567890";
  const registerPassword = "34rfcxx32";
  const source = "Google";

  const currentUser = await loginUser.findOne({ registerEmail })
  if (currentUser==null) {
    const newUser = new loginUser({
      registerEmail,
      registerName,
      registerUsername,
      registerContactno,
      registerPassword,
      source 
  })

    const saved = await newUser.save();
    const currentUser = await loginUser.findOne({ registerEmail })
    const token = await currentUser.generateAuthToken();
    console.log(`token ${token}`); 
    res.cookie('jwtToken', token, { expires: new Date(Date.now() + 60 * 60 * 1000) })
    req.session.userName = currentUser.registerName;    
    return done(null, profile);
  }
  else {
    console.log('not saved');
    const currentUser = await loginUser.findOne({ registerEmail })
    const token = await currentUser.generateAuthToken();
    console.log(`token1 ${token}`); 
    res.cookie('jwtToken', token, { expires: new Date(Date.now() + 60 * 60 * 1000) })
    req.session.userName = currentUser.registerName;   
    console.log(profile); 
    return done(null, profile);

  }
}
catch(e) {
  console.log(`error while google login ${e}`);
}
}))



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

app.get('/auth/google/callback',
// passport.authenticate('google', { failureRedirect: '/about' }),
// function(req, res) {
//   console.log('dashboard');
//   // Successful authentication, redirect home.
//   res.redirect('/dashboard');
passport.authenticate( 'google', {
successRedirect: '/protected',
failureRedirect: '/auth/google/failure'
}));


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

 passport.deserializeUser(function(user, done){
 done(null, user);
 })

 app.get('/protected', auth, async(req, res) => {
 try {
 // console.log(req.user);
 console.log('dashboard');
// console.log(req.user.displayName);
// console.log("isLoggedIn req.user: " + req.user);
// console.log(req)
   res.render('dashboard');
}
catch(e) {
console.log(`protected ${e}`);
}
});

app.get('/auth/google/failure', isLoggedIn, (req, res) => {
console.log('fail');
res.render('/');
});

 function isLoggedIn(req, res, next) {

// req.user ? next() : res.sendStatus(401);
console.log(req.user);
if (req.cookies!=undefined) {
  console.log("Authenticated"); 
  return next();
}
res.redirect('/');
}

您不需要将 JWT 令牌保存在数据库中,永远不要这样做,因为它们不是为它准备的。相反,使用 API 调用发送 JWT。并且在来自前端的每个后续调用中将令牌附加到调用中。

I am able to save tokens to the database but am not able to save tokens on the browser.

您不需要将其保存到数据库。在浏览器上,您可以将其保存到本地存储。

const token = 'get token from API call';

localStorage.setItem("auth_token", token);
localStorage.getItem("auth_token");