使用 Mocha + supertest + passport 使用 JWT 测试经过身份验证的路由失败

Posted

技术标签:

【中文标题】使用 Mocha + supertest + passport 使用 JWT 测试经过身份验证的路由失败【英文标题】:Testing authenticated routes with JWT fails using Mocha + supertest + passport 【发布时间】:2017-01-29 10:41:45 【问题描述】:

我正在尝试在 Mocha 中测试经过身份验证的路由,但在 beforebeforeEach 钩子中创建的用户不存在。

test.js

const should = require('chai').should(),
    mongoose = require('mongoose'),
    request = require('supertest'),
    app = require('../../../../server'),
    agent = request.agent(app),
    AdminUser = require('../../../models/AdminUser');

var credentials = 
    username: 'admin',
    password: 'password'
;

var admin = new AdminUser(credentials);

describe('authenticated routes', function() 
     before(function (done) 
         admin.save(function (err) 
             if (err) done(err);

             agent.post('/api/authenticate')
             .send(credentials)
             .end(function (err, res) 
                 if (err) done(err);
                 jwtToken = res.body.token;
                 done();
             );
         );
     );

    it('should get content with 200', function (done) 
        agent.get('/api/content')
        .set('Authorization', 'JWT ' + jwtToken)
        .expect(200)
        .end((err, res) => 
            if (err) return done(err);
            done();
        );
    );

    after(function (done) 
        AdminUser.remove().exec();
        done();
    )
);

我尝试使用beforeEach 并在afterEach 中进行清理,/api/authenticate 的初始帖子成功返回200,收到了一个令牌,但是当尝试使用该令牌进行身份验证时,它得到一个@987654329 @。这是因为找不到AdminUser

在护照策略中,我有:

module.exports = function (passport) 
    passport.use(new JwtStrategy(opts, function(jwtPayload, done) 
        AdminUser.findOne( username: jwtPayload.username , function (err, user) 
            if (err)  return done(err); 
            if (!user) 
                return done(null, false,  message: 'Bad token.' );
            
            return done(null, user);
        );
    ));
;

AdminUser 始终是null,无论我将用户保存在何处。仅当我嵌套回调但否定使用 beforebeforeEach 时才有效。

【问题讨论】:

【参考方案1】:

您需要将 Authorization 标头与 Bearer 身份验证方案一起使用:

.set('Authorization', 'Bearer ' + jwtToken)

【讨论】:

以上是关于使用 Mocha + supertest + passport 使用 JWT 测试经过身份验证的路由失败的主要内容,如果未能解决你的问题,请参考以下文章

在 Mocha 测试中使用 Superagent/Supertest 和 Express 应用程序

如何使用 supertest 和 agent 在 mocha 测试中发出经过身份验证的请求?

nodejs+mocha+supertest+chai进行测试(only demo)

使用 mocha 测试 express 服务器并使用异步初始化程序进行 supertest 调用请求两次

测试受保护的 api 调用、mocha、supertest、node js、passport

如何使用 Passport 验证 Supertest 请求?