Проблема аутентификации express-jwt с веб-API

У меня есть приложение, использующее стандартную аутентификацию jwt, показанную ниже и скопированную из readme-файла express-jwt.

app.use(jwt({
  secret: 'hello world !',
  credentialsRequired: false,
  getToken: function fromHeaderOrQuerystring (req) {
    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
        return req.headers.authorization.split(' ')[1];
    } else if (req.query && req.query.token) {
      return req.query.token;
    }
    return null;
  }
}));

Когда я нажимаю api, заголовок авторизации равен «Bearer hello world!». Это соответствует моему секрету, но я получаю несанкционированное сообщение 401. Кто-нибудь знает, почему? Разве req.headers.authorization.split ('') [1] не должно соответствовать секрету?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
538
2

Ответы 2

Нет, предъявитель - это не ваш секрет. Это jwt в кодировке base64, содержащий (заголовок, полезную нагрузку и подпись). Секрет используется для подписи полезной нагрузки jwt с помощью алгоритма, указанного в заголовке jwt.

Прочтите введение к официальный сайт JWT, чтобы понять эту концепцию.

Вы можете использовать пакет npm JsonWebtoken для реализации аутентификации на основе jwt в своем экспресс-приложении. Вот как работает аутентификация:

  • импортировать jwt из пакета

    const jwt = require ('jsonwebtoken');

Установите токен в файле login.service.js или там, где это требуется, с соответствующими данными в качестве полезной нагрузки:

 const token = jwt.sign('payload', 'secret key',
               { expiresIn: 60*60 });
   how token looks: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiYW5pcyIsImVtYWlsIjoic29tZW1lYWlsLmNvbSIsImlhdCI6MTUxNjIzOTAyMn0.FyDrUNkvDi82lYv8JioAB9Ih8vyn6Y6mY8PpUiIz8nY 

Расшифровать его можно, вставив токен на сайт jwt.io.

  • Обычно мы храним токен в файлах cookie (перед отправкой ответа в файле login.router.js установите cookie как токен):

     router.get('/auth/google/callback', (req, res, next) => {
      loginCtrl.redirectGoogle(req, res, next).then((result) => {
         res.cookie('userToken', token);
        res.redirect('/#/app/home');
         }, (err) => { 
         console.info("Error in authentication **[ ", err, " ]** ");
      res.redirect(500, '/#/login');
    });  
    
  • теперь напишите промежуточное ПО (аутентификацию), которое вызывается перед каждым запросом API (файл authentication.router.js).

router.use((req, res, next) => {
  try {
    const token = req.cookies.currentUser;
       // console.info('cookie', token);
       // to  decode token
    if (token) {
      authCtrl.verifyToken(token, (err, decoded) => {
        if (err) {
          res.clearCookie(config.UserToken);
          res.status(401).json({ error: ' Session Timeout... Please login again' });
         // console.info('token expired');

         // res.redirect('/#/login');
        } else {
          req.user = decoded;
          next();
        }
               // console.info('Token verified');
               // res.cookie(config.cookie.name,successResult.authToken);
      });
    } else {
           // if there is no token
           // return an error
      return res.status(403).send({
        message: 'User not authenticated.',
      });
    }
  } catch (error) {
   // console.info(error);
    return error;
  }
});
  • Внутри функции verifyToken, которая находится внутри файла auth.controller.js, мы расшифровать токен:

const jwt = require('jsonwebtoken');

const verifyToken = (usertoken, done) => {
  jwt.verify(usertoken,'secret key', (err, res) => {
    if (err) {
      return done(err);
    }
    return done(null, res);
  });
};

module.exports = {
  verifyToken,
};

Теперь ваши конечные точки API защищены аутентификацией. Убедитесь, что промежуточное ПО для аутентификации находится наверху в файле app.js.

router.use('/login', require('./modules/login'));
router.use('/logout', (req, res) => {
  res.clearCookie(userToken);
  res.redirect('/');
});
router.use(require('./modules/authentication'));
// Each Module to be placed after this
router.use('/communityMembers',require('./modules/communitymember'));

Другие вопросы по теме