我在身份验证方面遇到问题。我在节点中有一条路由,该路由根据用户通过护照登录时设置的cookie来检测谁是用户。
我正在发送一封欢迎电子邮件,告诉新用户如何访问该应用程序,并提供他们可以单击以转到首页的链接。电子邮件中的链接看起来与我插入的链接不同。当单击时,尽管它们将它们带到正确的域,所以我想电子邮件服务在幕后使用了某种重定向。
因此,一旦进入该应用程序,我就不得不使用嵌入的第三方来显示一项新的用户测试服务,该服务没有可供我使用的api。为了确保用户完成测试,在最后一个问题上放置了一个按钮,该按钮打开一个带有提供的URL的新选项卡,该URL用于在服务器上确认用户已完成测试。
是的,我完全知道那是多么令人费解。
问题似乎是用户登录时创建的cookie对新选项卡无效,并且服务器拒绝身份验证。 如果我直接在网址列中输入网址,而不是通过电子邮件生成所有内容的网址。有人可以向我解释这里可能会发生什么以及如何解决吗?
这是设置我的身份验证的方式:
//create db to store user sessions
var options = {
host: config.db.host,port: 3306,user: config.db.username,password: config.db.password,database: config.db.database
};
var sessionStore = new MySQLStore(options);
//handles cookie/session creation
app.set('trust proxy',1); // trust first proxy
app.use(session({
secret: config.sessionKey,resave: false,store:sessionStore,saveUninitialized: true,duration:365*24*60*60*1000,//1 year in milliseconds
cookie: {
secure: false,maxAge:365*24*60*60*1000 //1 year in milliseconds
}
}));
app.use(passport.initialize());
app.use(passport.session());
require('./services/passport');
身份验证路由仅询问用户是否已通过身份验证:
router.put('/auth',asyncMiddleware( async (req,res)=>{
if (!req.isAuthenticated()){
return res.status(403).send('Forbidden');
}
let user_id = req.user;
let user = await db.user.findOne({
where:{
id : user_id
}
});
return res.status(200).json({
'message' : 'SUCCESS','user_id':user.id,'first_name' : user.first_name,'last_name' : user.last_name,'username' : user.username,'user_type' : user.permission_id,'user_status_id' : user.user_status_id,});
}));