Passport.ls/Mysql - 获取authenticated/current用户数据

Passport.ls/Mysql - get authenticated/current user data

我正在构建一个聊天应用程序。当用户发送消息时,我希望他们的回复输出用户名、日期、评论。

目前我只是在测试是否可以从我的数据库中输出选定的数据。

我正在使用 Passport js 对用户进行身份验证。我可以手动从数据库中输出用户的选定数据,但这不是我想要的,我只想输出已登录的 in/authenticated 用户的数据。

Index.js

    sqlDatabase.query('SELECT users.username, comments.comments, comments.date FROM users, comments WHERE users.id=comments.id',

    function(error, results, fields) {
        if (error) throw error;

        results.forEach((id) => {
            console.log(id.username, id.date, id.comments)

以上输出所有用户的选择数据,而不是CURRENT/LOGGED IN user

输出:Kaunda 2020-07-08 你好朋友。很高兴见到你!

输出NowayOut 2020-07-09 这是我的时间

如您所见,我的数据库中有两个 table。我从一个 table 中提取用户名,从另一个 table

中提取日期和评论

有人告诉我尝试使用 session_id 来做我想做的事。我不知道。这是我的登录代码。

router.post("/login",
   passport.authenticate('local', {
       successRedirect: '/',
       failureRedirect: '/login',
       // failureFlash: true,

   }));
passport.use(new LocalStrategy({
       usernameField: 'email',
       passwordField: 'password',
       passReqToCallback: true,
   },
   function(req, email, password, done) {
       console.log(email, password, done);
       const sqlDatabase = require('../db.js');


       sqlDatabase.query('SELECT * FROM users WHERE email = ?', [email], (err, results, fields, res) => {
           if (err)
               return done(err);
           console.log(err, fields, results);




           if (results.length === 0) {
               done(null, false, { message: 'Check email and password again.' });
           } else {

               const hash = results[0].
               password.toString();

               const user_id = results[0].id;


               bcrypt.compare(password, hash, function(err, response) {
                   console.log('User id is:' + user_id);
                   if (response === true) {
                       return done(null, 'User id is:' + user_id);
                   } else {
                       console.log(user_id);
                       console.log(err);
                       return done(null, false, { message: 'This is a test notification.' });

                   }
               })
           }

       })

   }));

passport.serializeUser(function(user_id, done) {
   console.log(user_id);
   done(null, user_id);
   console.log(done);

});
passport.deserializeUser(function(user_id, done) {
   done(null, user_id);
   console.log(done);

});```


Yeah, so I've been battling with this. I want to output data of ONLY the authenticated user. Excuse all the console.log() stuff

Thanks in advance.


要仅限制登录的用户使用您的聊天功能,您可以使用中间件来检查用户是否已通过身份验证,如果没有,它将被重定向,您只需将其放在不同的文件中并导出,然后添加即可到您要限制访问的任何路线。

module.exports={
    checkuserauth:(req,res,next)=>{
        if(req.isAuthenticated()){
        res.set('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0') 
            return next()
        }
     req.flash("error_msg","Please login to see this content") 
     res.redirect('/login')
        },
    forwardAuthenticated: function(req, res, next) {
    if (!req.isAuthenticated()) {
      return next();
    }
    res.redirect('/');      
  }
    }

现在在你的路由中你可以像这样添加中间件

router.get("/",checkuserauth,(req,res){ //your code here })

要仅输出已登录 in/authenticated 用户的数据,您可以使用通行证 serializes 用户进入会话这一事实,它将 user Id 附加到 request您可以使用它来了解已登录的用户并向数据库发出请求 req.user_id。 另一种方法是在您的数据库中为每个用户添加一个 boolean 变量 isauthenticated ,只要用户成功通过身份验证,您只需将其设置为 true,这将允许您仅过滤经过身份验证的用户

我知道我不久前发布了这个,但这里是答案。我使用护照用户获取当前 logged/authenticated 用户。

router.post("/superhero", function(req, res) {

    const user = req.user;
    const comments = req.body.comments;

    sqlDatabase.query("INSERT INTO comments (user_id, comments) VALUES (?, ?)", [user, comments],
        function(error, results, fields) {
            if (error) throw error;
            console.log(results);
            console.log(comments);
            console.log(error)

        });
})