2017-07-31 167 views
1

我正在嘗試在Express中使用SSL身份驗證,如http://intown.biz/2016/11/22/node-client-auth/中所述。缺少Express SSL身份驗證功能?

我們使用TypeScript作爲我們的服務器代碼(除了客戶端Angular代碼)以獲得強大的打字效果。 我們使用Express 4.14.1,@ types/express「:」^ 4.0.36「

上面的鏈接(和大多數服務器端NodeJS一樣)是JavaScript而不是TypeScript。有一大塊代碼在看起來像下面的鏈接:

app.use(function (req, res, next) { 
 
    if (!req.client.authorized) { 
 
     return res.status(401).send('User is not authorized'); 
 
    } 
 
    #examine the cert itself, and even validate based on that! 
 
    var cert = req.socket.getPeerCertificate(); 
 
    if (cert.subject) { 
 
     console.log(cert.subject.CN); 
 
    } 
 
    next(); 
 
});

在鏈接的作品(他有一個鏈接,下載項目)

我的問題討論中的應用:最新的典型es(4.0.36)似乎沒有req.clientreq.socket.getPeerCertificate()。它們在我的TypeScript代碼中不可用(我們有Express導入/必需)。此外,我嘗試 將TypeScript請求對象傳遞到普通的JavaScript函數中,並且req.clientreq.socket.getPeerCertificate()仍未定義。他們只是 不存在。

注:我們也有Passport初始化。我們正在使用它來驗證我們的Web應用程序(客戶端和內部REST API),但我們有一個我們希望通過SSL證書保護的外部/單獨REST API。我懷疑插入Passport會導致req.clientreq.socket.getPeerCertificate()功能消失嗎?

誰能告訴我爲什麼我在Express代碼中看不到req.client或req.socket.getPeerCertificate()?他們被替換了什麼?

任何幫助/確認與此將不勝感激。

+0

不確定'req.client',但應該定義'req.socket',因爲Express'req'對象是內置'http.ClientRequest'的「增強版本」,它具有一個['.socket '](https://nodejs.org/api/http.html#http_request_socket)屬性。在TLS連接的情況下,這是['tls.TLSSocket'](https://nodejs.org/api/tls.html#tls_class_tls_tlssocket)的實例,它具有['.authorized'](https:// nodejs .ORG/API/TLS。html#tls_tlssocket_authorized)和['.getPeerCertificate'](https://nodejs.org/api/tls.html#tls_tlssocket_getpeercertificate_detailed)屬性。 – robertklep

+0

哦,'req.client'和'req.socket'([here](https://github.com/nodejs/node/blob/ae4fde8bc883686def5badfb324236320669e8f4/lib/_http_incoming.js#L71))是一樣的)。 – robertklep

回答

2

robertklep是一個巨大的幫助。

爲打字稿,我需要進口tls.TLSSocket讓打字都解決了, 和投req.socketTLSSocket

((req.socket) as TLSSocket).authorized 
((req.socket) as TLSSocket).getPeerCertificate(). 

在普通的舊的JavaScript它變得有點複雜。對於我的開發環境,我創建了一個httpServer(http.createServer)。在我的生產環境中,我創建了一個httpsServer(https.createServer)。因此,如果我沒有在我的生產環境中工作,因爲未使用JavaScript req.clientreq.socket.getPeerCertificate()進行定義,因爲尚未使用https.createServer創建服務器。

謝謝robertklep!