JsonWebTokenError: неправильно сформирован jwt (создание API в ExpressJs)

Я проверил много ответов в Интернете, но думаю, что делаю и другую ошибку. Мой вопрос строго связан с защитой маршрута /contribute с использованием JWT (который является запросом POST). Мой API находится в expressjs. Сначала я нажимаю маршрут /login с правильными учетными данными и получаю токен. Этот токен я перепроверил на jwt.io и там написано "Неверная подпись". Вот этот жетон: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWJqZWN0IjoiNWVhZDlkOGY4N2VjMjkwMDE3YzRkODkzIiwiaWF0IjoxNjA3ODczNjY2fQ.H5RI-lOBzfJo4_FgParuJA4ULnJ_An6uihiF31bzNtU

Затем я выбирал маршрут /contribute с тем же токеном. Вот мой код:

API.js

const express = require('express');
const router = express.Router();
...
const jwt = require('jsonwebtoken');
...
router.post('/login', (req, res) => {
    let userData = req.body
    User.findOne({ email: userData.email }, (error, user) => {
        if (error) {
            console.info(error)
        } else {
            if (!user) {
                res.status(401).send('Invalid email')
            } else if (user.password !== userData.password) {
                res.status(401).send('Invalid password')
            } else {
                let payLoad = { subject: user._id };  // tried { subject: 'foobar' } also
                let token = jwt.sign(payLoad, 'secretKey');
                res.status(200).send({ token, userData, user });
            }
        }
    })
})

router.post('/contribute', verifyToken, (req, res) => {
    console.info('Pushing new article');
    let userPost = req.body;
    let post = new Post(userPost);
    post.save((error, registeredPost) => {
        if (error) {
            console.info(error);
        } else {
            res.status(200).send(registeredPost);
        }
    })
})

function verifyToken(req, res, next) {
    if (!req.headers.authorization) {
        return res.status(401).send('Unauthorized request')
    }
    let token = req.headers.authorization.split(' ')[1];
    if (token === 'null') {
        return res.status(401).send('Unauthorized request')
    }
    let payload = jwt.verify(token, 'secretKey')
    if (!payload) {
        return res.status(401).send('Unauthorized request')
    }
    req.userId = payload.subject
    next()
}

module.exports = router;

Но в тот момент, когда я нажимаю /contribute, я получаю это:

JsonWebTokenError: неправильно сформирован jwt в Object.module.exports [как проверить] (C:\Users\320050772\Documents\socialcoderapinodejs\node_modules\jsonwebtoken\verify.js:63:17) в verifyToken (C:\Users\320050772\Documents\socialcoderapinodejs\routes\api.js:86:23) в Layer.handle [как handle_request] (C:\Users\320050772\Documents\socialcoderapinodejs\node_modules\express\lib\router\layer.js:95:5) далее (C:\Users\320050772\Documents\socialcoderapinodejs\node_modules\express\lib\router\route.js:137:13) в Route.dispatch (C:\Users\320050772\Documents\socialcoderapinodejs\node_modules\express\lib\router\route.js:112:3) в Layer.handle [как handle_request] (C:\Users\320050772\Documents\socialcoderapinodejs\node_modules\express\lib\router\layer.js:95:5)

Пожалуйста, укажите на мою ошибку.

Я также проверил Postman. Токен сгенерирован, но снова недействителен. Почему мой код генерирует недопустимые токены.

Я перепроверил на jwt.io и там написано "Неверная подпись" - это обычно бывает, когда не вставляешь секрет или ключ в поле в правой колонке. Не зная ключа, jwt.io не может проверить подпись.

jps 14.12.2020 14:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
1
4 925
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Бро, я проверил твой код, все в порядке, verifyToken ✅ (но не объекты User и Post), убедитесь, что вы правильно отправляете заголовок авторизации, например:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWJqZWN0IjoiMTIzNDQ1IiwiaWF0IjoxNjA3ODgwMjkwfQ.zJbcqM8yBRABxhm5BgQNow1gmzsgUjiLdPdv7Tq5ND4

Я использовал код из вашего примера и немного изменил

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

app.get('/', (req, res) => res.send('123'));

app.post('/login', (req, res) => {
  let payLoad = { subject: '123445' };
  let token = jwt.sign(payLoad, 'secretKey');
  res.status(200).send({ token });
});

app.post('/contribute', verifyToken, (req, res) => {
  res.send('i can reach here...');
});

function verifyToken(req, res, next) {
  if (!req.headers.authorization) {
    return res.status(401).send('Unauthorized request');
  }
  let token = req.headers.authorization.split(' ')[1];
  if (token === 'null') {
    return res.status(401).send('Unauthorized request');
  }
  let payload = jwt.verify(token, 'secretKey');
  if (!payload) {
    return res.status(401).send('Unauthorized request');
  }
  req.userId = payload.subject;
  next();
}

app.listen(3000, () => console.info('server on 3000'));
Ответ принят как подходящий

Было замечено, что сгенерированный токен действителен. Но он не доходит до бэкэнда с предстоящим следующим вызовом, например, Post of /contribute. показывает какое-то недопустимое значение. Поэтому пусть действительный токен будет получен на Backend, чтобы jwt.varify мог правильно его проверить.

SyntaxError: await допустимо только в асинхронной функции

Tanzeel 13.12.2020 18:35

скопируйте и первую строку = router.post("/login", async (req, res) => {

mabdullahse 13.12.2020 18:35

да я всё скопировал

Tanzeel 13.12.2020 18:36

нет :-( Можем ли мы сделать онлайн-звонок, пожалуйста. Я поделюсь своим экраном.

Tanzeel 13.12.2020 18:39

конечно, мы можем иметь. поделитесь ссылкой на зум

mabdullahse 13.12.2020 18:40

Пожалуйста, присоединяйтесь к этому: us04web.zoom.us/j/…

Tanzeel 13.12.2020 18:41

спасибо, что указали на мою ошибку. Я соответствующим образом обновлю свой код, и вы сможете отредактировать ответ, чтобы я мог его принять. Дай мне немного времени. :-)

Tanzeel 13.12.2020 19:18

Хорошо, @Tanzeel я буду

mabdullahse 13.12.2020 19:20

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