【问题标题】:Passport isAuthenticated() always returns false?Passport isAuthenticated() 总是返回 false?
【发布时间】:2021-01-28 10:18:45
【问题描述】:

所以我在使用 Passport 时遇到了问题,我一直在尝试放弃我原来的身份验证方法,因为 Passport 支持其他类型,例如 Google 和 GitHub。我正在尝试实现本地身份验证,但它似乎无法正常工作,即使在查找了许多文章之后它们都不起作用。

这是在代码的顶部:

const cookieExpirationDate = new Date();
cookieExpirationDate.setDate(cookieExpirationDate.getDate() + 7);

app.use(session({
    secret: secret_key,
    store: sessionStore,
    resave: true,
    saveUninitialized: true,
    cookie: {
        httpOnly: true,
        sameSite: 'strict',
        expires: cookieExpirationDate
    }
}));

// PASSPORT //
app.use(passport.initialize());
app.use(passport.session());

passport.use('local', new LocalStrategy({

        usernameField: 'username',

        passwordField: 'password',

        passReqToCallback: true //passback entire req to call back
    }, async function (req, username, password, done) {


        if (!username || !password) {
            return done(null, false, {message: 'Please complete the form!'})
        }
        const reqBody = {
            response: req.body['h-captcha-response'],
            secret: captcha_key
        }
        let axiosResult = await axios.post('https://hcaptcha.com/siteverify', qs.stringify(reqBody), {
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            }
        })
        if (axiosResult.data.success === true) {
            let results = await runQuery('SELECT * FROM accounts WHERE (username = ? OR email = ?)', [username, username])
            const forwarded = req.headers['x-forwarded-for']
            const ip = forwarded ? forwarded.split(/, /)[0] : req.connection.remoteAddress

            if (!results.length) {
                let amtLeft = await loginAttempts(ip);
                if (amtLeft > 1) {
                    return done(null, false, {message: `Incorrect Username and/or Password! (${amtLeft} attempt(s) left)`});
                } else {
                    return done(null, false, {message: `You must wait 15 minutes before trying again!`});
                }
            }
            let user = results[0]
            let isMatch = await bcrypt.compareSync(password, user.password)
            if (!isMatch) {
                let amtLeft = await loginAttempts(ip);
                if (amtLeft > 1) {
                    return done(null, false, {message: `Incorrect Username and/or Password! (${amtLeft} attempt(s) left)`});
                } else {
                    return done(null, false, {message: `You must wait 15 minutes before trying again!`});
                }
            } else {
                if (user.activation_code === "activated") {
                    return done(null, user)
                } else {
                    return done(null, false, {message: 'Check your email for an activation email!'})
                }
            }
        } else {
            return done(null, false, {message: `You must complete the captcha!`});
        }
    }
));

passport.serializeUser(function (user, done) {
    done(null, user.id);
});

passport.deserializeUser(async function (usrid, done) {
    let results = await runQuery('SELECT * FROM accounts WHERE id = ?', usrid)
    done(results[0]);
});

登录 API 部分:

app.post('/login_sys', regularFunctions, function (req, res, next) {
    passport.authenticate('local', {failWithError: true}, function (error, user, info) {
        if (error) {
            return res.status(500).json(error);
        }
        if (!user) {
            return res.status(401).json(info);
        }
        return res.status(200).send('Success')
    })(req, res, next);
})

常规函数:

let regularFunctions = [
    bodyParser.urlencoded({extended: true}),
    bodyParser.json(),
    function (req, res, next) {
        console.log('Authenticated: ' + req.isAuthenticated())
        if (req.isAuthenticated()) {
            req.session.loggedin = true;
            return next();
        } else {
            req.session.loggedin = false;
            return next();
        }
    }
]

如果它失败或成功,我需要它向客户端返回某种通知,因为我有一个小弹出窗口,让他们知道如果它有效,他们将被重定向,并通知他们他们的尝试离开。问题是它可以工作并说它已登录,但是当我刷新页面时它从未登录过。

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

    好吧,找了一会儿才找到答案,我只好在login_sys路由里面使用req.login

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-24
      • 2014-03-24
      • 1970-01-01
      • 2014-12-23
      • 2021-11-06
      • 2014-04-28
      • 2018-08-06
      • 2019-01-05
      相关资源
      最近更新 更多