Метод .put для обновления пароля в запросах mocha chai не работает - PullRequest
1 голос
/ 08 марта 2019

Мой код:

const model = require('../db/models/user');
const describe = require('mocha').describe;
const assert = require('chai').assert;
const chaiHttp = require('chai-http');
let chai = require('chai');
let server = require('../server');

chai.use(chaiHttp);

describe('Test user registration, login, update password', () => {
    beforeEach((done) => {
        // Reset user mode before each test
        model.User.remove({}, (err) => {
            console.log(err);
            done();
        })
    });

Теперь я получаю сообщение об ошибке

UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство '_id' из null

в самом маршруте, а именно:

router.put('/me/update-password', async (req, res, next) => {
    const {body} = req;
    const auth = req;
    const userId = auth._id; // problem on this line!

// rest of code...

});

Итак, после регистрации и входа в систему (что работает нормально, как и должно!), У меня много проблем с обновлением пароля. В params я отправляю сгенерированный токен, а в body находится поле пароля с новым паролем. На живом примере (например, Почтальон) он работает как надо, а в тестах - просто нет.

Я действительно понятия не имею и уже потерял много своего времени на это (3 дня).

Может кто-нибудь, пожалуйста, посмотрите, предложите решение?

Очень ценится.

Обновлено с помощью auth.js:

const jwt = require('jsonwebtoken');

const isAu = function(req) {
  return jwt.verify(req.headers.authorization.split(' ')[1], 'secret', function (err, decoded) {
    if (err) {
      return null;
    }

    return decoded;
  });
};

module.exports = isAu;

1 Ответ

0 голосов
/ 08 марта 2019

EDIT: Поскольку ОП изменил исходный вопрос после того, как на него был дан ответ, ссылка на оригинал: https://stackoverflow.com/revisions/55064109/1

=======================================

Метод JWT verify принимает токен авторизации - вы выбираете его правильно, разделяя строку заголовка авторизации для получения токена.

Строка заголовка HTTP-авторизации содержит тип схемы аутентификации (Bearer, Basic, Digest и т. Д.) И значение токена

Authorization: Bearer eyJhbGciOiJIUzI1NiIXVCJ9...TJVA95OrM7E20RMHrHDcEfxjoYZgeFONFh7HgQ

но ваш заголовок Authorization в запросе Chai содержит только значение токена, а не тип схемы аутентификации.

Предположим, что ваша схема аутентификации Носитель , вам необходимо установить это в заголовке авторизации запроса Chai:

...
chai.request(server)
 .put('/api/me/update-password')
 .set('Authorization', `Bearer ${token}`)
 .send(`${updatedPassword}`)
 .end((error, response) => {
    assert.equal(response.status, 200);
    done();
 });
...

С другой стороны, если вы не укажете тип аутентификации в заголовке авторизации запроса, вы должны отправить его в JWT на veirfy:

const isAuthenticated = function(req) {
  return jwt.verify(req.headers.authorization, 'secret', function (err, decoded) {
    if (err) {
      return null;
    }

    return decoded;
  });
}; 


...