@aznhautroalvyl

Работа с сессиями и токенами для аутентификации?

Задача -- авторизовать пользователя и в зависимости от его прав предоставлять или не предоставлять доступ к определёнными действиям.
Проверку на пользователя сделал с помощью функции :
function permit(username) {
  return (request, response, next) => {
    if (username === 'admin') {
      return next();
    }
    response.status(403).json({ message: 'Forbidden' });
  };
}


Пример вызова функции:
app.route('/test-page')
  .get(permit('admin'), (req, res) => {
   ...
  });


Проблема в том, чтобы понимать какой пользователь авторизовался и использует систему в данный момент.
Пробовал сделать сессии, но запутался в их реализации. Пример кода :
app.use(session({
  secret:  'testtest',
  resave:  false,
  saveUninitialized:  true,
  cookie:  { secure:  true }
}));

Как правильно сделать аутентификацию и авторизацию?
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 2
Robur
@Robur
Знаю больше чем это необходимо
Возьмите что-то готовое, passport.js например
Ответ написан
Комментировать
Deissh
@Deissh
I like Python, Node.JS, Go, pain, bugs and my cat.
Пример использования в виде промежуточного обработчика (можно и без passport.js)

export const token = ({ required, roles } = {}) => (req, res, next) =>
  passport.authenticate('token', { session: false }, (err, user, info) => {
    if (err || (required && !user) || (required && !~roles.indexOf(user.role))) {
      return res.status(401).end();
    }
    req.logIn(user, { session: false }, (err) => {
      if (err) return res.status(401).end();
      asyncRedisClient.set(user.id, '1', 'EX', 900000); // 900000 = 15 минутам
      next();
    });
  })(req, res, next);


Пример использования
router.get('/',
  token({ required: true, roles: ['admin'] }),
  someepichandler);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы