代码之家  ›  专栏  ›  技术社区  ›  Zack

PassportJs刷新会话变量?

  •  0
  • Zack  · 技术社区  · 6 年前

    我使用PassportJS和节点来处理身份验证。 如果身份验证失败,我希望暂时保存输入,以便在网页上重新加载它们,并显示某种错误消息:

    Passport登录策略:

    const localLogin = new LocalStrategy(
        {
            passReqToCallback: true,
            usernameField: 'email',
            passwordField: 'password'
        },
        async (req, email, password, done) => {
            try {
                const user = await User.findOneByEmail(email);
                if (user) {
                    const passwordsMatch = await PasswordHash.compare(password, user.password);
                    if (passwordsMatch) {
                        return done(null, user);
                    }
                }
    
                console.log('Sending inputs back to the user : ' + req.sessionID);
                req.session.inputs = {
                    email: email,
                    . . . 
                }
                return done(null, false);
    
            } catch (err) {
                console.log(err);
                return done(err);
            }
        });
    

    帐户登录路由器:Express中的URL结构(“/帐户/*”):

    accountsRouter.get('/login', async (req, res) => {
        res.render('accounts/login.ejs', 
        { 
            inputs: req.session.inputs
        });
    
        console.log("BEFORE DELETE: " + req.session.inputs);
        delete req.session.inputs;
        console.log("AFTER DELETE: " + req.session.inputs);
    });
    

    我希望它能够存储输入,并在登录失败后将其显示给用户。如果用户在Chrome上点击刷新(获取/帐户/登录),而不是再次点击登录按钮(发布/帐户/登录),则请求。一场输入变量应为空。但是,由于某种原因,即使控制台显示变量已被删除,该变量在刷新浏览器时仍保持其值。

    下面是我得到的输出:

    # Getting the login page (blank fields)
    BEFORE DELETE: undefined
    AFTER DELETE:  undefined
    GET /accounts/login 200 7.042 ms - 2327
    
    # Click the login button
    Sending inputs back to the user : Km2o9VFTWkvQxsz28Tt7Tx9mzL2NS14f
    POST /accounts/login 302 31.850 ms - 74
    
    # Login fails, displaying inputs back to user. Delete variable on render
    BEFORE DELETE: [object Object]
    AFTER DELETE: undefined
    GET /accounts/login 200 3.919 ms - 2338
    
    # Hits Chrome refresh on login page, req.session.inputs should be undefined here but it's not?
    BEFORE DELETE: [object Object]
    AFTER DELETE: undefined
    GET /accounts/login 200 2.404 ms - 2338
    

    如果有人能给我指出正确的方向,我将不胜感激!

    2 回复  |  直到 6 年前
        1
  •  0
  •   marquaye    6 年前

    我怀疑浏览器正在缓存输入值。

    渲染视图时,请按如下方式显式设置输入值:

    <input type="text" name="textfield" value="">
    
        2
  •  0
  •   Zack    6 年前

    确定它不仅在Passport中,而且在Express Session中。发现你必须打电话 await req.session.save(); 或者任何更改仅在本地进行,不会保存在会话存储中。