我有一個感性的時候試圖測試使用護照的JWT戰略,Authorization頭保護途徑。在單元測試護照JWT權威性 - 插座掛斷
我試過愛可信,supertest,SuperAgent的,我也得到了同樣的錯誤 - 「插座掛斷」:
Error: socket hang up
at createHangUpError (_http_client.js:253:15)
at Socket.socketOnEnd (_http_client.js:345:23)
at emitNone (events.js:91:20)
at Socket.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickDomainCallback (internal/process/next_tick.js:122:9) code: 'ECONNRESET', response: undefined }
這完全適用於開發環境,這只是發生在測試環境 - 單元測試或dev env指向測試數據庫/用戶。
我知道這個錯誤意味着連接被服務器或語法錯誤就崩潰關閉,但有沒有語法錯誤。端點不會讓過去的護照身份驗證:
passport.authenticate('jwt'...
爲什麼?這怎麼解決?
端點:
router.route('/private')
.get(
passport.authenticate('jwt', { session: false }), (req, res, next) => {
res.json({ allTheThings: true });
})
測試:
describe('GET /api/private',() => {
it('should work',() => {
const USER_JWT_VALID = 'JWT asdf.....';
let instance = axios.create();
instance.defaults.headers.common['Authorization'] = USER_JWT_VALID;
return instance.get('http://localhost:3000/api/private')
.then((response) => {
expect(response.data).to.be.an('object'); // response.data undefined
}).catch((error) => {
console.log('err ', error); //socket hang up
});
});
});
如果我刪除passport.authenticate
和只需發送一個JSON響應,它按預期工作。
該日誌顯示了該請求在授權報頭具有正確JWT發送。
RE評論
我有開發和測試不同的DB /用戶。在dev中使用測試數據庫,我能夠複製單元測試中看到的問題。如果我排除授權標題,正如期望的那樣,我會得到一個'未授權'響應(來自令牌檢查功能)。
當我加入智威湯遜的授權頭,我沒有得到中得到任何迴應:(
進一步調試
看來,我的API不再能夠做任何GET請求,在測試環境中,如果有一個授權頭。由於沒有頭,一切工作正常。我懷疑這是一些最近的依賴更新做。
發生什麼情況,如果在開發環境中使用您使用在您的測試完全相同的JWT令牌?這聽起來好像是應用程序崩潰是由於無效令牌 –
@miparnisari增加了一些信息的問題 –
嗯......我想最好的辦法是通過線調試的代碼行:/抱歉,我不能想什麼其他 –