护照上的 req.isAuthenticated() 和 passport.authenticate() 有什么区别?

What's the difference between req.isAuthenticated() and passport.authenticate() in passport?

我是编程初学者,正在通过 node.js、express 和 mongoDB 试验身份验证过程。我已经使用 passport、passport-local 和 passport-local-mongoose 为用户创建了 login/logout。

当我的身份验证成功时,用户将重定向到我的索引页面,其中显示 his/her 名称。

但是我有一个问题…… req.isAuthenticated() 和 passport.authenticate() 有什么区别?

在我的 main.js 中,我直接将我的 req.user 放在我的会话的核心:

const passport = require('passport');
const expressSession =require('express-session');
const cookieParser = require('cookie-parser');
const connectFlash = require('connect-flash')
const localStrategy = require('passport-local').Strategy;

app.use(cookieParser("SecretStringForCookies"));
app.use(
    expressSession({
    secret : "SecretStringForCookies",
    cookie : {
        maxAge: 2000000
    },
    resave : false,
    saveUninitialized : false
}))

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

//Serializing and deserializing user for checking login status in cookie

const User = require('./models/allUsers');

passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

app.use(connectFlash());

app.use((req, res, next) => {
    res.locals.flashMessages = req.flash();
    res.locals.currentUser = req.user;
    next();
});

为了使我的身份验证成功,我在 UserController.js 页面中使用了以下代码:

module.exports = {

    authentication : passport.authenticate("local", {
        failureRedirect: "/login",
        successRedirect: "/index",
        successFlash : { type: 'success_msg', message: 'Welcome !' },
        failureFlash : { type: 'error_msg', message: 'Your email and/or password are wrong, try again !' }

    }),

    isAuthenticatedUser : (req, res, next) => {
        if(req.isAuthenticated()) {
            next();
        }
        res.redirect = "/login";

    },

}  

我的认证路线:

const express = require('express');
const router = express.Router();
const userController = require('./userController');

router.post('/login', userController.authenticate, userController.isAuthenticatedUser);

router.get("/logout", userController.isAuthenticatedUser, (req, res)=> {req.logout(), res.redirect("/")});

router.get('/index'); 

我的 HTML :

        <nav class="nav-links">
            <% if(currentUser) { %>
            <ul>
                <li><%= currentUser.name %></li>
                <li><a href="/logout">Logout</a></li>
                <li><a href="/index">Home</a></li>
            </ul>
            <% } %>
    </nav>

但是,我的登录身份验证过程似乎只使用 passport.authenticate() 就可以正常工作,而我的 login/logout 路由似乎不需要我关于 req.isAuthenticated() 的功能.

对不起,如果我的问题看起来很愚蠢或奇怪,但我真的很困惑它的目的……

你能给我一些建议吗?

提前感谢您的帮助!

req.isAuthenticated()命令returns判断用户是否登录,另一个确保用户登录

passport.authenticate() 方法从 request 对象中提取用户凭据,并将它们传递给用于对进程进行身份验证的身份验证函数,

passport.use(new LocalStrategy(
  function(username, password, done) { // this is an authentication function
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (!user.verifyPassword(password)) { return done(null, false); }
      return done(null, user);
    });
  }
));

默认情况下,当认证成功时,req.user 属性设置为认证用户,建立会话,调用堆栈中的下一个函数。

req.isAuthenticated() 方法检查用户是否已经通过身份验证功能进行身份验证,例如,如果您有一个管理仪表板页面并且您希望确保只有经过身份验证的用户才能访问此页面,因此您使用 req.isAuthenticated() 方法来确保发送请求的用户已经通过身份验证功能进行了身份验证。

module.exports= (req,res, next)=>{
if(req.isAuthenticated()){ //checks whether user 
//is authenticated by the passport.authenticate() method
next();
}
res.redirect('/login');
}