Проверка подлинности Node.js, Express, Passport и ssh2-sftp-client

В настоящее время я играю с технологиями, перечисленными в названии, и пытаюсь найти полезное решение для веб-sftp. Я столкнулся с контрольно-пропускным пунктом, я уверен, что в основном это вызвано моей нелюбовью на арене, но как в мире вы передаете имя пользователя и пароль в ssh2-sftp_client из паспорта?

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

let Client = require('ssh2-sftp-client');
let sftp = new Client();
sftp.connect({
host: '127.0.0.1',
port: '22',
username: 'test',
password: 'Password!1'
}).then(() => {
 return sftp.list('/pathname');
}).then((data) => {
 console.log(data, 'the data info');
}).catch((err) => {
 console.log(err, 'catch error');
});

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

RowDataPacket {
  username: 'test',
  password: 
 '$2b$10$Zk4JNqBlEFmDAvtRI/DUjOp0Tmmza
   CHKJVVnnmNn3Po.ztB3cZ3ta' 
}

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

passport.use(new LocalStrategy(
  function(username, password, done) {
  console.log(username);
  console.log(password);
  const db = require('./db');

  db.query('SELECT id,password FROM users WHERE username = ?', [username],
  function(err, results, fields){
    if(err) { done(err)};
    if(results.length === 0)
    {
      return done(null, false);
    } else {
      const hash = results[0].password.toString();
      bcrypt.compare(password, hash, function(err, response){
        if(response === true) {
          let Client = require('ssh2-sftp-client');
          let sftp = new Client();
          sftp.connect({
              host: '127.0.0.1',
              port: '22',
              username: username,
              password: password
          }).then(() => {
              return sftp.list('/pathname');
          }).then((data) => {
              console.log(data, 'the data info');
          }).catch((err) => {
              console.log(err, 'catch error');
          });
          return done(null, {user_id: results[0].id, files: list});
        }
        else {
          return done(null, false);
        }
      });
    }



  });

  }));

Итак, мой вопрос: как я могу получить пригодный для использования пароль из паспорта, передать его клиенту sftp и при этом поддерживать разумный уровень безопасности?

0 ответов

Другие вопросы по тегам