簡體   English   中英

在nodejs中谷歌登錄后如何創建jwt令牌

[英]How to create jwt token after google login in nodejs

在這里,我嘗試使用谷歌登錄並將 jwt 令牌保存到數據庫以及登錄后的瀏覽器中。 我能夠將令牌保存到數據庫中,但無法在瀏覽器上保存令牌。 我該怎么做?

在這里,我嘗試使用谷歌登錄並將 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。 並且在來自前端的每個后續調用中,將令牌附加到調用中。

我能夠將令牌保存到數據庫中,但無法在瀏覽器上保存令牌。

您不需要將其保存到數據庫。 在瀏覽器上,您可以將其保存到本地存儲。

const token = 'get token from API call';

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM