【问题标题】:NodeJS and Express -- How to mock token authentication middleware for testing?NodeJS 和 Express——如何模拟令牌认证中间件进行测试?
【发布时间】:2016-11-05 17:05:48
【问题描述】:

我正在制作一个使用 JWT 进行身份验证的 REST API,但为了测试我的端点,我想模拟验证 JWT 的中间件。

我已经定义了一个用于检查令牌的中间件:

// middlewares/auth.js

nJwt = require('njwt');
nconf = require('nconf');

module.exports = {
    verifyToken: function(req, res, next) {
        // check header or url parameters or post parameters for token
        var token = req.body.token || req.query.token || req.headers['x-access-token'];

        // decode token
        if (token) {

            // verifies secret and checks exp
            nJwt.verify(token, nconf.get("auth:secret"), function(err, verifiedJwt) {
              if (err) {
                return res.json({ success: false, message: 'Failed to authenticate token.' });
              } else {
                // if everything is good, save to request for use in other routes
                req.userId = verifiedJwt.body.sub;
                next();
              }
            });

        } else {
            // if there is no token
            // return an error
            return res.status(403).send({
                success: false,
                message: 'No token provided.'
            });

        }
    }
}

然后在我的路由器中,我可以在受保护的端点上导入和使用这个中间件

// routes/someRoutes.js

var router = require('express').Router();
var verifyToken = require('../middlewares/auth').verifyToken;

router.use(verifyToken);

// define routes

现在我想模拟这个中间件,这样我就可以在不需要有效令牌的情况下测试端点。我尝试过使用 chai/mocha/sinon,但运气不佳

// tests/someRoutes.js

var auth = require('../middlewares/auth');
var sinon = require('sinon');

describe('someRoute', function() {
    var verifyTokenStub; 

    before(function (done) {
        verifyTokenStub = sinon.stub(auth, 'verifyToken', function(req, res, next) {
            req.userId='test-id';
            next();
        });
    });
});

但这仍然是调用原来的 verifyToken 方法。非常感谢任何帮助!

【问题讨论】:

  • 你找到解决办法了吗?

标签: node.js authentication express mocking sinon


【解决方案1】:
  1. 更改您的middlewares/auth.js 文件检查process.env.NODE_ENV

例子:

// middlewares/auth.js
...
    // decode token
    if (token || process.env.NODE_ENV === 'test') {//Changes in this string

      // verifies secret and checks exp
      nJwt.verify(token, nconf.get("auth:secret"), function(err, verifiedJwt) {
...
  1. 如果您使用supertest 或具有相同功能的软件包,请使用环境变量-NODE_ENV=test mocha 运行mocha。

  2. 如果在完全运行的情况下测试您的应用程序,那么您应该使用环境变量 - NODE_ENV=test npm start 启动它。

不是嘲讽,希望对你有帮助。

【讨论】:

  • 我不确定我是否喜欢将状态绑定到身份验证中间件的想法......看起来很混乱。
  • 到目前为止,这是调整测试以支持身份验证的最简单方法。我在想这个技巧是否可能暗示安全问题,但我无法想象如何
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多