JWT не работает должным образом с Node.JS - PullRequest
0 голосов
/ 13 апреля 2020

Мне трудно заставить вещи работать так, как им положено с JWT на Node JS. Позвольте мне сначала сказать, что моя цель (после входа в систему) получить доступ к privateRoute маршруту моего API.

Я всегда нажимаю:

 authHeader == null 

внутри authenticateToken функция промежуточного программного обеспечения, хотя я пробовал много вещей.

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

Вот соответствующий код.

app.get('/privateRoute', authenticateToken, function(req, res) {
    // Useful work to do, after logging in.
    .......
});


function authenticateToken(req, res, next) {
  // Gather the jwt access token from the request header
  const authHeader = req.headers['authorization'],
  token = authHeader && authHeader.split(' ')[1]

  if (token == null) {
    console.log('authenticateToken-401')
    return res.sendStatus(401) // There isn't any token.
  }
  // It never reaches this point !!!

  jwt.verify(token, 'myBigSecret', (err, user) => {
    console.log(err)
    if (err) {
      console.log('authenticateToken-403')
      return res.sendStatus(403)
    }
    req.user = user
  })
}


app.get('/entryRoute', function(req, res) {
  res.set('authorization', 'Bearer ' + myJWT_Token);
  res.redirect('/privateRoute');
});

Может кто-нибудь сказать мне, что мне нужно изменить в своем коде, чтобы мое (вероятно, не очень хорошее) решение работало? Или скажите мне лучший способ сделать это?

Ниже приведена дополнительная информация из браузера, на случай, если это может быть полезно.

В меню FireFox Сервис, Веб-разработчик, Интернет Приставка; Вкладка сети. Я вижу следующее:

Для заголовков ответа (/ entryRoute):

Authorization : Bearer eyiwhfehihinR…CuwfihvihiL_hfgSt_J8D
Connection :keep-alive
Content-Length : 56
Content-Type : text/html; charset=utf-8
Date : Mon, 13 Apr 2020 09:46:55 GMT
Location : /privateRoute
Server : Xoibuy
Vary : Accept
Via : 1.1 vegur
X-Powered-By : Express

Для заголовков запроса (/ privateRoute):

Accept : text/html,application/xhtml+xm…ml;q=0.9,image/webp,*/ *;q=0.8
Accept-Encoding : gzip, deflate, br
Accept-Language : en-US,en;q=0.5
Connection : keep-alive
Host : myapp.herokuapp.com
Upgrade-Insecure-Requests : 1
User-Agent : Mozilla/5.0 (Macintosh; Intel …) Gecko/20100101 Firefox/75.0

1 Ответ

1 голос
/ 13 апреля 2020

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

const consumeApi() = async () => {
   const response = await fetch('https://example.domain/endpoint', {
      method: 'POST' // could be any other methods (GET, POST, PUT, PATCH, DELETE, etc)
      headers: {
         'Authorization': 'Token some_token_value'
      }
   });

   // Response status other than 200
   if (response.status !== 200) return alert('Something wrong happened.'); 

   // Response status 200
   // do someting ...
}

Используя приведенный выше код, вы сможете добавить заголовок авторизации в ваш запрос Http. Надеюсь, это поможет.

- РЕДАКТИРОВАТЬ Вы можете попробовать создать новый файл HTML. Скажем, пример. html, который выглядит следующим образом:

// example.html
<!DOCTYPE html>
<html>
<script>
   const consumeApi() = async () => {
      const response = await fetch('https://example.domain/endpoint', {
         method: 'POST' // could be any other methods (GET, POST, PUT, PATCH, DELETE, etc)
         headers: {
            'Authorization': 'Token some_token_value'
         }
      });

      // Response status other than 200
      if (response.status !== 200) return alert('Something wrong happened.'); 

      // Response status 200
      // do someting ...
   }

   // call the function directly after loading the HTML page
   consumeApi().then();
</script>
</html>

Затем попробуйте открыть файл примера. html через веб-браузер, и он должен вызывать ваш API напрямую. Таким образом, вы сможете отправить запрос на сервер node.js с заголовком авторизации. Надеюсь, это поможет

...