2016-12-30 64 views
4

我有一個感性的時候試圖測試使用護照的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請求,在測試環境中,如果有一個授權頭。由於沒有頭,一切工作正常。我懷疑這是一些最近的依賴更新做。

+1

發生什麼情況,如果在開發環境中使用您使用在您的測試完全相同的JWT令牌?這聽起來好像是應用程序崩潰是由於無效令牌 –

+0

@miparnisari增加了一些信息的問題 –

+0

嗯......我想最好的辦法是通過線調試的代碼行:/抱歉,我不能想什麼其他 –

回答

0

創建測試環境了全新的用戶和使用後這在單元測試中,一切都按預期工作e用戶的授權頭中的JWT完美工作。

看來,在某種程度上使用無效智威湯遜正在使用的用戶進行身份驗證,在測試環境中(從蒙戈DB)。也許是基於用戶架構來構建JWT的方式。

我不知道爲什麼會發生這種情況(早期構建階段)。現在無法複製。

我的單元測試,執行以下操作:

1)POST來認證端點,以獲得JWT令牌(從用戶的電子郵件地址和密碼)

2)購買私人身份驗證只與智威湯遜端點。

在私人GET,passport.authenticate('jwt' ....只是不是在所有的工作,因此,沒有任何請求或響應。

我看不到任何其他的原因,這是行不通的以外無效JWT。

我從這裏學到的,如果你有失敗的單元測試與認證有關,排除從舊/新用戶和工作。

+0

它不能被該令牌是過期?我有這個問題一次,但我使用的是硬編碼的JWT –

+0

我不這麼認爲,因爲正在使用的jwt是在之前的驗證帖子中生成的,該驗證帖也設置了7天的失效日期。 –

+0

是的,我認爲是這樣。很奇怪的問題:/ –