如何在 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");
我在这里尝试使用 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");