javascript - Google 策略在 Passport.js 中不起作用
问题描述
当我点击链接时,谷歌策略会对我进行身份验证并打印req.user
到控制台。
{
_id: 60c9ef51cb807642b299eab8,
googleId: 'my-google-id',
email: 'ouzaysal@gmail.com',
__v: 0
}
然后重定向命令起作用并将我重定向到 /protected。我的 isLoggedIn 中间件(在 /protected 路由器上)开始工作。中间件返回req.session.passport
未定义。但是passport.js 刚刚验证了我。无论如何,然后我无法访问 /protected 页面,我被重定向到 /login 页面。
我认为cookie是用redirect命令重置的。这是我的代码。
const passport = require("passport");
const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
app.use(session({
name: "sidd",
secret: "verysafesecret",
resave: false,
saveUninitialized: false,
store: store,
cookie: {
httpOnly: true,
sameSite: true,
secure: false
}
}));
passport.use(new GoogleStrategy({
clientID: 'google-id',
clientSecret: 'google-secret',
callbackURL: "http://localhost:1012/auth/google/redirect",
scope: [
'openid',
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/userinfo.email'
]
},
function (accessToken, refreshToken, profile, done) {
userSchema.findOne({ googleId: profile.id,}).then(function(currentUser){
if(currentUser){
done(null, currentUser);
} else {
const user = profile;
new userSchema({
googleId: profile.id,
email: profile.emails[0].value
}).save().then(function(){
done(null, profile);
});
}
});
}
));
passport.serializeUser(function (user, done){
return done(null, user.id);
});
passport.deserializeUser(function (id, done){
userSchema.findById(id, function (err, user){
if(err) {
done(err, user);
}
done(null, user);
});
});
function isLoggedIn(req, res, next){
console.log(JSON.stringify(req.session.passport))
if (req.isAuthenticated()) {
console.log("logged in")
return next();
} else {
console.log("not logged in, redirect you")
res.redirect("/login");
}
}
app.use(passport.initialize());
app.use(passport.session());
router.get('/auth/google', passport.authenticate('google'));
router.get("/auth/google/redirect",
passport.authenticate('google', {failureRedirect: "/login"}) , function(req, res){
console.log(req.user ,'\n', req.session.passport));
res.redirect("/protected")
});
router.get("/protected", isLoggedIn, function(req, res){
const stringSession = JSON.stringify(req.session);
res.send(`hello and ${stringSession}`);
res.end();
});
<a href="/auth/google">google</a>
解决方案
推荐阅读
- macos - NSWindow 是否可以在没有动画的情况下从全屏模式关闭?
- postgresql - Sequelize Include 在没有结果的情况下不起作用
- javascript - JavaScript (Postgres DB) - 如何在 WHERE IN ( ) 子句中使用带有数组作为参数的准备好的语句
- c++ - 具有不变和普通 typedef 的 typedef 有什么不同
- php - 如何使用 API 资源更改 json 格式?
- azure - Azure 队列存储消息未保存在 Azure 函数上的正确队列中
- testing - 如何使用jmeter执行存储过程并获得结果
- android - kotlin (Android Studio 3) 中未解析的引用 getValue()
- vbscript - vbs中的特殊字符
- reactjs - Redux 没有将状态传递给道具