node.jsクライアントでのWindows統合認証
Node.jsをクライアントとして使用する場合、Windows統合認証を使用してサーバーに接続できますか(IISに接続する場合など)?
これを検索すると、node.jsがサーバーとして使用されている場合にのみ結果が表示されます。
2015更新:Windows統合認証を実装するモジュールがいくつかあります。 node-sspi はSSPI(WindowsセキュリティAPI)を使用してサーバー側の処理を行いますが、 クライアント認証を行いません です。 いくつかのクライアント実装http-ntlm などがありますが、ユーザーパスワードを必要とするため、真に統合されていません-透過的な認証にSSPIを使用しません。
2019 Update:kerberos ライブラリを使用して、SSPIを使用して真のWindows統合HTTP認証を行うことができるようです(つまり、 、ノードプロセスのトークンを使用して透過的な認証を行います)。 kerberos-agent を参照してください。これは明らかにNTLM/NegotiateではなくKerberosを使用しているため、実際の状況によっては機能しない場合があります。
「Windows統合認証」は、NTLM認証と呼ばれるものです。 IISからHTTP 401を受信し、WWW-Authenticate
ヘッダーにNTLM
が含まれていると、NTLM認証プロトコルを実装できるようになります。引用 NTLM認証プロトコルに関するこのドキュメント :
クライアントはサーバーから保護されたリソースを要求します。
GET /index.html HTTP/1.1
サーバーは
401
ステータスで応答し、クライアントが認証する必要があることを示します。NTLM
は、WWW-Authenticate
ヘッダーを介してサポートされる認証メカニズムとして提示されます。通常、サーバーはこの時点で接続を閉じます。HTTP/1.1 401 Unauthorized WWW-Authenticate: NTLM Connection: close
Internet ExplorerがNTLMを選択するのは、それが提供される最初のメカニズムである場合のみであることに注意してください。これは、クライアントがサポートされている最も強力な認証方式を選択する必要があると述べているRFC 2616とは矛盾しています。
クライアントは、 タイプ1メッセージ パラメータを含む
Authorization
ヘッダーを使用してリクエストを再送信します。タイプ1メッセージは、送信用にBase-64でエンコードされています。この時点以降、接続は開いたままになります。接続を閉じるには、後続の要求の再認証が必要です。これは、サーバーとクライアントが、HTTP 1.0スタイルの "Keep-Alive"ヘッダーまたはHTTP 1.1(永続的な接続がデフォルトで採用されている)を介した永続的な接続をサポートする必要があることを意味します。関連するリクエストヘッダーは次のように表示されます。GET /index.html HTTP/1.1 Authorization: NTLM TlRMTVNTUAABAAAABzIAAAYABgArAAAACwALACAAAABXT1JLU1RBVElPTkRPTUFJTg==
サーバーは、
401
ヘッダーに Type 2 message を含むWWW-Authenticate
ステータスで応答します(これもBase-64でエンコードされています)。これを以下に示します。HTTP/1.1 401 Unauthorized WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADAAAAABAoEAASNFZ4mrze8AAAAAAAAAAGIAYgA8AAAARABPAE0AQQBJAE4AAgAMAEQATwBNAEEASQBOAAEADABTAEUAUgBWAEUAUgAEABQAZABvAG0AYQBpAG4ALgBjAG8AbQADACIAcwBlAHIAdgBlAHIALgBkAG8AbQBhAGkAbgAuAGMAbwBtAAAAAAA=
クライアントは、Base-64エンコードされた Type 3メッセージ を含む
Authorization
ヘッダーを使用してリクエストを再送信することにより、Type 2メッセージに応答します。GET /index.html HTTP/1.1 Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGoAAAAYABgAggAAAAwADABAAAAACAAIAEwAAAAWABYAVAAAAAAAAACaAAAAAQIAAEQATwBNAEEASQBOAHUAcwBlAHIAVwBPAFIASwBTAFQAQQBUAEkATwBOAMM3zVy9RPyXgqZnr21CfG3mfCDC0+d8ViWpjBwx6BhHRmspst9GgPOZWPuMITqcxg==
最後に、サーバーはクライアントのタイプ3メッセージの応答を検証し、リソースへのアクセスを許可します。
HTTP/1.1 200 OK
タイプ2メッセージのチャレンジに返信 の方法を理解する必要があります。ここで、ユーザーのパスワードはMD4ハッシュされ、チャレンジデータを暗号化するためのDESキーの作成に使用されます。
ログインしたユーザーの資格情報データにどのようにアクセスして、これを実現できるかはわかりませんが、 native C++ addon を記述して話すことができると確信しています必要なWindows APIに。または、ユーザーのパスワードを尋ねるだけで済むと思います。
または、 NTLMの混乱を処理するソフトウェアを介してNodeリクエストをプロキシする のようにすることもできます。
Kerberosの場合:
node-sspi
Just on windows No client side node Supports NTLM too
パスポート交渉
Needs python on the server it's a passportJs strategy
NTLMの場合
node-sspi
Just on windows No client side node Supports Kerberos too
- httpntlm
- エクスプレスNTLM
- request-ntlm
nTLM
experimental project!
ntlm-auth
experimental!
パスポートNTLM
supports SMB protocol it's a passportJs strategy
Kerberosにはpassport-negotiateを、NTLMにはexpress-ntlmを選択しました
クライアント側で機能するのは、node-libcurlを使用してREST/HTTP呼び出しを実行することです。
ここにサンプルコードがあります:
var endpoint = urlString;
var url = require("url");
var endpointUrl = url.parse(endpoint);
var Curl = require( 'node-libcurl' ).Curl;
var curl = new Curl();
curl.setOpt( 'USERNAME', '' );
//curl.setOpt( 'VERBOSE', 1 );
curl.setOpt( 'URL', endpoint );
curl.setOpt( 'HTTPAUTH', Curl.auth.NEGOTIATE );
curl.setOpt( 'NOPROXY', endpointUrl.hostname );
curl.on( 'end', function( statusCode, body, headers ) {
if (statusCode === 200) {
console.log(body);
cb(null, { statusCode, body, headers } );
} else {
cb(new Error(), { statusCode, body, headers } );
}
this.close();
});
curl.on( 'error', curl.close.bind( curl ) );
curl.perform();