缺少快速SSL身份验证功能?

时间:2017-07-31 12:10:01

标签: javascript node.js express typescript ssl

我正在尝试使用Express进行SSL身份验证,如http://intown.biz/2016/11/22/node-client-auth/中所述。

我们使用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();
});




链接中讨论的应用程序有效(他有一个下载项目的链接)。

我的问题:最新类型(4.0.36)似乎没有 req.client req.socket.getPeerCertificate()。它们在我的TypeScript代码中不可用(我们确实有Express导入/必需)。另外,我试过了 将TypeScript Request对象传递给普通的JavaScript函数, req.client req.socket.getPeerCertificate()仍未定义。他们只是 不在那里。

注意:我们也确实已经初始化了Passport。我们使用它来验证我们的Web应用程序(客户端和内部REST API),但我们有一个 我们希望使用SSL证书保护的外部/单独REST API。我怀疑是否插入Passport会导致 req.client req.socket.getPeerCertificate()功能消失?

有人能告诉我为什么我的Express代码中没有看到req.client或req.socket.getPeerCertificate()吗?他们被某些东西取代了吗?

对此有任何帮助/致谢将不胜感激。

1 个答案:

答案 0 :(得分:2)

robertklep是一个巨大的帮助。

对于TypeScript,我需要导入tls.TLSSocket才能输入所有内容, 并将req.socket转换为TLSSocket

((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!