mongoose req.isAuthenticated()仅在passport.authenticate之后返回true,任何其他路由将返回false值

v7pvogib  于 2023-08-06  发布在  Go
关注(0)|答案(2)|浏览(86)

以下是我注册路线:
(我用的是passport-local-mongoose)

router.post("/register", (req,res)=>{
    console.log(req.body);
    User.register({
            username: req.body.username,
            mail: req.body.email
        }, req.body.password, (err, user)=>{
            err ? console.log(err) : passport.authenticate("local")(req, res, () => {
                console.log(user.username + " registered and logged in.");
                // console.log(user);
                res.send(req.isAuthenticated());
                console.log(req.user);

              })

        })
    
});

字符串
用户创建和验证后,一切都很好。我有req.user对象,我有isAuthenticated为true(我尝试以1秒的间隔记录它-总是返回true)。但是,如果我尝试检查用户是否经过身份验证,从一些不同的路线,例如:

router.get("/getUser", (req, res)=>{
  res.send(req.user);
  console.log(req.isAuthenticated());
})


我立即在控制台中得到false,并从req. user中得到undefined。看起来问题是--在认证之后对服务器的任何请求都会删除req.user

yquaqz18

yquaqz181#

答案很晚,但我昨天也遇到了同样的问题,需要努力学习,因为这里没有答案:)。
如果您在发送请求时没有指定,则前端的cookie不会更新,方法是添加:{ withCredentials: true },并且必须在注册/登录POST路由上执行此操作
f.e:

await axios.post("http://localhost:3001/register", payload, { withCredentials: true } )

字符串
但要做到这一点,你必须在服务器上传递一些cors选项:

const corsOptions = {
    origin: "http://localhost:3000", // notice origin won´t work as any (*) from that point
    credentials: true,
    "Access-Control-Allow-Credentials": true
};

app.use(cors(corsOptions));
'''

r7s23pms

r7s23pms2#

在设置会话时,将saveUninitialized设置为false,选择false对于实现登录会话很有用。默认值为true,但不建议使用默认值,因为默认值将来会更改。

app.use(session({
    secret: [YOUR_SECRET],
    resave: false,
    saveUninitialized: false
}));

字符串

相关问题