2017-07-31 14 views
1

http://intown.biz/2016/11/22/node-client-auth/で説明されているように、ExpressでSSL認証を使用しようとしています。Express SSL認証機能がありませんか?

私たちは強いタイピングの利点のために、サーバーコード(クライアントの角度コードに加えて)にTypeScriptを使用しています。 私は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.clientまたはreq.socket.getPeerCertificate()を持っていないようです。 TypeScriptコードでは使用できません(私たちはExpressインポート/必須です)。また、 はTypeScriptリクエストオブジェクトをプレーンJavaScript関数に渡してみました。req.clientreq.socket.getPeerCertificate()は未定義です。彼らはただ はありません。

注:パスポートは初期化されています。これを使用してWebアプリケーション(クライアントと内部REST API)を認証していますが、SSL証明書を使用して保護する外部/別個のREST API があります。 Passportを差し込むと、req.clientreq.socket.getPeerCertificate()の機能が消えるのではないかと疑いがありますか?

Expressコードでreq.clientまたはreq.socket.getPeerCertificate()が表示されない理由を教えていただけますか?彼らは何かに取り替えられましたか?

これに関する助言/謝辞は高く評価されます。

+0

'req.client'についてはわかりませんが、Expressのreq'オブジェクトは組み込みの' http.ClientRequest'の「拡張バージョン」であるため、 'req.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'([ここ](https://github.com/nodejs/node/blob/ae4fde8bc883686def5badfb324236320669e8f4/lib/_http_incoming.js#L71))と同じです。 – robertklep

答えて

2

robertklepは非常に役に立ちました。

活字体のために、私はすべての入力を取得するためにtls.TLSSocketをインポートする必要が 、働いたとTLSSocketとしてreq.socketをキャスト:通常の古いJavaScriptで

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

を、それは少し複雑になりました。私の開発環境では、httpServer(http.createServer)を作成しています。私のプロダクション環境では、httpsServer(https.createServer)を作成しています。したがって、サーバがhttps.createServerで作成されていないため、JavaScriptのreq.clientreq.socket.getPeerCertificate()は定義されていませんでした。

ありがとうございますrobertklep!

関連する問題