内部ネットワーク上のツールからデータを要求する簡単なスクリプトを記述しようとしています。これがコードです:
#!/usr/bin/node
var https = require('https');
var fs = require('fs');
var options = {
Host: '<link>',
port: 443,
path: '<path>',
auth: 'username:password',
ca: [fs.readFileSync('../.cert/newca.crt')]
};
https.get(options, function(res) {
console.log("Got response: " + res.statusCode);
res.on('data', function (d) {
console.log('BODY: ' + d);
});
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
質問は、資格情報をプレーンテキストでauth:
に提供するのではなく、Kerberosチケットを使用して認証するにはどうすればよいですか?
Paul Scheltemaの答えでは、オペレーティングシステムの深さからticketdataを取得する必要があります。ユーザー(またはユーザーに代わるモジュール)は、GSS-APIを使用して、Active Directoryによってチケットデータを生成させる必要があります。
このようなメカニズムはChromeに存在しますが、Node.js(ChromeのJavaScriptエンジンのみ)には含まれていないようです。そのため、たとえば次のようにモジュールを追加する必要があります。
このようなモジュールをインストール/コンパイルするには、Visual Studioが必要になる場合があります。
環境をセットアップするには、-すべてのコンピューターで、ポート88(Kerberos)および53(dns)でtcpおよびudpを有効にする必要があります。 -Windows Serverでは、Active Directoryが実行されている必要があります(ldap、dns、kdc)-ページでは https://www.npmjs.org/package/passport-kerberos 彼らはREALMという用語を使用しています。ドメインの名前で、大文字で書かれています。
から http://docs.Oracle.com/cd/E24191_01/common/tutorials/authn_kerberos_service.html
メッセージレベルの標準のクライアントトークンの場所:Kerberosサービスチケットは、Authorization HTTPヘッダーで送信するか、メッセージ自体の内部(要素内など)で送信できます。または、メッセージ属性に含めることもできます。次のオプションのいずれかを選択します。
したがって、ユーザー名:パスワードの代わりに、チケットを提供します
あるいは、以下に述べるように、その情報をメッセージ本文に入れるか、メッセージ属性として入れることができます
var request = https.request(options, function(resource) {
var chunks = [];
resource.on('data', function (chunk) {
chunks.Push(chunk);
});
resource.on('end', function () {
var data = chunks.join('');
console.log(data);
});
}
request.on('error',...)
request.send('<body-with-ticket>');
request.end();
編集:
「」部分は、チケットを使用する場所の例であり、マルチタイプの本文に入れて送信します。または、WWW-Authenticateヘッダーを使用して送信します
例えば。 https.requestのオプションに追加します
options = {
Host: 'hostname',
port: 443,
'WWW-Authenticate': 'Negotiate ' + ticketdata
};
グーグルはそれがどのように機能するかについていくつかの素晴らしい図を持っています: https://developers.google.com/search-appliance/kb/secure/kerberos-diagram
「kerberos」モジュール、バージョン0.0.12を使用してこれを動作させることができました。私は実用的な例で要旨を作成しました:
https://Gist.github.com/dmansfield/c75817dcacc2393da0a7
基本的に、「Authorization」ヘッダーデータを取得するには3つの方法を使用します。
次に、 "Authorization"ヘッダー(上記のWWW-Authenticateではなく、サーバーが送信するもの)を作成し、機能するはずです。
注:通常、ウェブブラウザはリソースをリクエストし、レスポンスでWWW-Authenticate:Negotiateヘッダーで401を取得してから、「Authorization」ヘッダーで提供されたチケットデータでリソースを再リクエストします。この2ステップのダンスは、すべてのリソースで発生します。それが何か意味があるのかどうかわかりません。
Windowsを使用している場合は、SSPIインターフェースを使用できます。プロジェクトnode-expose-sspi
でNodeに公開されています。
SSPIインターフェイスを使用すると、SSO(NTLMおよびKerberos)を使用して任意のクライアントまたはサーバーを作成できます。
https://github.com/jlguenego/node-expose-sspi
注:私はnode-expose-sspiの作成者です。