REST API - Как реализовать пользовательскую авторизацию? - PullRequest
1 голос
/ 06 октября 2019

Таким образом, в настоящее время я изучаю / создаю серверный интерфейс REST API для своего веб-приложения, используя NodeJS, ExpressJS и MySQL в качестве базы данных. Мой вопрос касается наилучшего способа осуществления авторизации, чтобы пользователь А не имел доступа к данным, принадлежащим другому пользователю, и не редактировал их. Обратите внимание, что я понимаю, что существует множество примеров для реализации авторизации на основе ролей (т.е. группы пользователей против групп администраторов и т. Д.), Но это не то, что я спрашиваю. Вместо этого, как мне авторизовать пользователя по данным, к которым он обращается?

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

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

Я очень ценю ваш совет, помощь, и если вы можете указать мне правильное направление.

Большое спасибо заранее.

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Самые простые вещи обычно работают лучше всего. Вам не нужно было бы иметь специальный сервис для проверки прав авторизации для каждого объекта, и вы можете сделать это на уровне доступа к данным, например. SELECT * FROM foo WHERE user_id = :currentUser или UPDATE foo SET foo = bar WHERE user_id = :currentUser

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

ДляHTTP401 сценарий будет:

const entity = loadFromDB(id);
if(entity.userId !== currentUserId) { 
  res.send(401); 
  return;
}

... update entity logic ...
1 голос
/ 06 октября 2019

Сохраните userId (или ownerId) в каждой таблице и создайте промежуточное программное обеспечение, в котором для каждого метода доступа к базе данных в качестве параметра требуется userId, например:

readOne(id, userId) {
    // implements SELECT * FROM example WHERE id = id AND userId = userId
}

updateOne(id, data, userId) {
    // implements UPDATE example SET data = data WHERE id = id AND userId = userId
}
...

В целях безопасности никогда не отправляйте какответ «Запрошенные данные существуют не у вас».

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