Passport.ls/Mysql - получить аутентифицированные / текущие данные пользователя - PullRequest
0 голосов
/ 11 июля 2020

Я создаю приложение для чата. Когда пользователи отправляют сообщения, я хочу, чтобы их ответы выводили имя пользователя, дату, комментарии.

Сейчас я просто проверяю, могу ли я выводить выбранные данные из своей базы данных.

Я использование Passport js для аутентификации пользователей. Я могу вывести выбранные данные пользователей из базы данных вручную, но это не то, что я хочу, я хочу вывести данные только зарегистрированного / аутентифицированного пользователя.

Индекс. 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 Hello friend. Рад вас видеть!

Вывод NowayOut 2020-07-09, это мое время

Как вы также можете видеть, в моей базе данных есть две таблицы. Я беру имя пользователя из одной таблицы, а дату и комментарии из другой таблицы.

Мне сказали попробовать использовать 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.


Ответы [ 2 ]

0 голосов
/ 27 июля 2020

Я знаю, что опубликовал это некоторое время назад, но вот ответ. Я использовал паспорт пользователя, чтобы получить текущего зарегистрированного / аутентифицированного пользователя.

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)

        });
})
0 голосов
/ 11 июля 2020

Чтобы ограничить использование вашего чата только авторизованных пользователей, вы можете использовать промежуточное ПО для проверки подлинности пользователя, если он не будет перенаправлен, вы можете просто поместить его в другой файл и экспортировать его, а затем добавить в любой маршрут, доступ к которому вы хотите ограничить.

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 })

Для вывода данных только авторизованных / авторизованных пользователей вы можете использовать тот факт, что паспорт serializes пользователей в сеансе, он прикрепляет user Id к request, и вы можете использовать это, чтобы узнать о пользователях, которые вошли в систему, и сделать запрос к базе данных req.user_id. альтернативный подход - добавить boolean переменную isauthenticated в вашу базу данных для каждого пользователя, и всякий раз, когда пользователь успешно аутентифицирован, вы просто устанавливаете для него значение true, это позволит вам фильтровать только аутентифицированных пользователей

...