REST API с JWT Token - Как определить владельца токена без отправки полезной нагрузки - PullRequest
0 голосов
/ 05 октября 2019

Итак, в настоящее время я изучаю / создаю серверный интерфейс REST API для моего веб-приложения, используя NodeJS, ExpressJS и JWT в качестве аутентификации. Мой запрос касается наилучшей практики определения владельца токена JWT на сервере без необходимости отправлять полезную нагрузку из веб-приложения, поскольку это ограничивает использование метода GET HTTP, чего я не хочу.

Вы можете спросить, почему я хочу идентифицировать владельца токена JWT, ну и все учебные примеры, из которых я извлек уроки, все воспринимают пользователя как необходимый объект, что имеет смысл просто иметьконечная точка говорит GET / user /: userId. Однако для других пользовательских конечных точек, таких как запись в блоге, я действительно не хочу прибегать к GET / user /: userId / blog /: id и, следовательно, к рассолу, в котором я нахожусь.

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


Сценарий:Пользователь уже вошел в систему и хотел бы просмотреть свой блог в конечной точке GET / blog /: id, но сервер должен подтвердить, что у пользователя есть доступ для просмотра этого блога


1. Передайте идентификатор пользователя в заголовок (тот, который я сейчас использую)

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

    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${jwtToken}`,
      UserId: userId
    }

Это хорошая практика для обеспечения необходимости отправки дополнительных данных внутри заголовка для всех вызовов на сервер, и что более важно, это безопасно делать?


2. Заставьте все конечные точки включать / user /: userId

Еще один простой способ, чтобы он стал GET / user /: userId / blog /: id. Хотя это нормально, я чувствую себя не в своей тарелке с решением. Но если это считается обычной практикой, то пусть будет так.


3. Кэшируйте токен против идентификатора пользователя

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


4. Временно сохраните токен в БД

По аналогии с номером 3, и, вероятно, даже проще, чем добавлять слой кэширования. Однако я не знаю, есть ли какие-либо последствия использования БД в качестве временного хранилища.


Так вот где я сейчас нахожусь. Я очень ценю ваше время и ответ. Заранее спасибо.

Ответы [ 2 ]

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

Идентификатор пользователя обычно кодируется в токене JWT, а промежуточное ПО JWT устанавливает атрибут request.user.

0 голосов
/ 05 октября 2019

при входе пользователя из бэкэнда вы должны предоставить токен jwt:

jwt.sign(payload,JWT_SECRET_KEY,{ expiresIn: JWT_EXPIRATION },(err, token) => {
            res.json({
              success: true,
              token: 'Bearer ' + token
            });
 });

теперь со стороны внешнего интерфейса вы должны сохранить этот токен внутри cookie или localStorage

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

headers: {
  "Content-Type": "application/json",
  "Authorization": `Bearer ${jwtToken}`,
}

теперь вам нужно определить маршрут, который требует идентификатор пользователя, как показано ниже:

router.get('/user', passport.authenticate('jwt', { session: false }),controllers.auth.user);

и вы можете просто получить информацию о пользователе в req.user

коде для controllers.auth.user:

module.exports=(req,res)=>{
    res.json({
        user:req.user
      });
}

промежуточное ПО для паспорта будет обрабатывать запрос, требующий аутентификации пользователяили нет, если пользователь аутентифицирован, вы можете получить пользователя в req.user

 passport.authenticate('jwt', { session: false })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...