Как проверить аутентификацию пользователя в методе GET? - PullRequest
0 голосов
/ 12 мая 2018

Мой интерфейс - это Reactjs и серверные Nodejs и expressjs с базой данных Postgresql. У меня есть простая страница входа, которая проверяет аутентификацию пользователя из базы данных. В моем приложении Reactjs после входа пользователь загружает файлы, а затем на моем nodejs есть метод GET, который отправляет файлы (res.sendFile), когда пользователь хочет получить файл с сервера. Это просто

<img alt='none' src=`http://example.com/source/${filename}` />

в моем приложении Reactjs, которое запрашивает файл.

Проблема: Если я не вошел в свое приложение, я могу вставить URL-адрес в браузере, и отобразится файл, который НЕ тот, который я хочу. Я хочу, чтобы метод GET на nodejs проверял аутентификацию пользователя, независимо от того, вошел ли пользователь в систему или нет, а затем только выполняет запрос на отправку файла.

Как я могу это сделать?

Должен ли я использовать какой-либо метод POST в моем приложении Reactjs, прежде чем он сделает любой запрос GET в то же место метода GET, затем проанализирует информацию и обработает ее в app.get и т. Д. *

Это мой nodejs + expressjs.

server.js

app.post('/signin', (req, res) => { signin.handleSignin(req, res, db, bcrypt)})

app.get('/source/:fileid', (req, res) => {
 const { fileid } = req.params;
 res.sendFile(__dirname + /data/ + fileid);
});

. / Контроллеры / signin.js

const handleSignin = (req, res, db, bcrypt) => {
const { email, password } = req.body;
if (!email || !password ) {
    return res.status(400).json('Incorrect form submission');
}
db.select('email', 'hash').from('login')
.where('email', '=', email)
.then(data => {
    const isValid = bcrypt.compareSync(password, data[0].hash);
if (isValid) {
        return db.select('*').from('users')
        .where('email', '=', email)
        .then(user => {
            res.json(user[0])
        })
        .catch(err => res.status(400).json('unable to get user'))
    } else {
        res.status(400).json('wrong credentials' )
    }
})
.catch(err => res.status(400).json('wrong credentials'))
}

module.exports = {
handleSignin: handleSignin
}

1 Ответ

0 голосов
/ 12 мая 2018

Вы должны внедрить механизм аутентификации через cookie или сессию.После успешного входа в систему вы будете устанавливать cookie в браузере, и при каждом запросе HTTP у вас будет доступ к данным cookie.

Создайте функцию промежуточного программного обеспечения, которая будет проверять действительные данные cookie в объекте req для каждого запроса API.

Если пользователь не вошел в систему и не пытается получить доступ к URL, вы не получите данныев файле cookie, и вы можете получить несанкционированный (401) доступ к этому конкретному ресурсу.

// On valid credentials, you can set the cookie like this
  res.cookie(cookieName, cookieData, cookieOptions);

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

function checkSession(req, res, next) {
  if(!req.cookies || !Object.keys(req.cookies).length){
    res.sendStatus(401)
  }
  else next();
}

Более подробную информацию о том, какиспользуйте cookie-парсер здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...