Ich versuche, ein einfaches Skript zu schreiben, das einige Daten von einem Tool in einem internen Netzwerk anfordert. Hier ist der Code:

#!/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);
});

Die Frage ist nun, wie ich ein Kerberos-Ticket zur Authentifizierung verwenden kann, anstatt meine Anmeldeinformationen in auth: im Klartext anzugeben.

18
mart1n 20 Nov. 2013 im 18:42

3 Antworten

Ich habe dies mit dem "Kerberos" -Modul, Version 0.0.12, zum Laufen gebracht. Ich habe einen Kern mit dem Arbeitsbeispiel erstellt:

https://gist.github.com/dmansfield/c75817dcacc2393da0a7

Grundsätzlich verwenden Sie drei Methoden, um die Headerdaten "Authorization" abzurufen:

  • authGSSClientInit, für das der Dienstname erforderlich ist, z. HTTP@somehost.com
  • authGSSClientStep, für das ein Cache für Anmeldeinformationen erforderlich ist (unter Linux erhalten Sie dies, indem Sie "kinit" ausführen und es mit "klist" überprüfen können), und Sie erhalten tatsächlich das benötigte base64-Material zurück (ohne die führende Zeichenfolge "Negotiate").
  • authGSSClientClean, wodurch alle zugewiesenen Speicherstrukturen freigegeben werden

Dann erstellen Sie einen "Authorization" -Header (NICHT WWW-Authenticate wie oben gezeigt, was der Server zurücksendet) und es sollte funktionieren.

Beachten Sie auch: In der Regel fordern Webbrowser eine Ressource an, erhalten eine 401 mit einem WWW-Authenticate: Negotiate-Header in der Antwort zurück und fordern die Ressource mit den im Header "Authorization" angegebenen Ticketdaten erneut an. Dieser zweistufige Tanz findet für jede Ressource statt. Ich bin mir nicht sicher, ob es etwas bedeutet oder nicht.

5
dmansfield 7 Aug. 2015 im 13:39

Wenn Sie unter Windows arbeiten, können Sie die SSPI-Schnittstelle verwenden. Es wird auf dem Knoten mit dem Projekt node-expose-sspi verfügbar gemacht.

Über die SSPI-Schnittstelle können Sie jeden Client oder Server mit SSO (NTLM und Kerberos) schreiben.

https://github.com/jlguenego/node-expose-sspi

Hinweis: Ich bin der Autor von node-expose-sspi.

0
jlguenego 18 März 2020 im 15:17

Von http://docs.oracle.com/cd/E24191_01/common/ Tutorials / authn_kerberos_service.html

Speicherort des Client-Tokens für Standards auf Nachrichtenebene: Das Kerberos-Serviceticket kann entweder im HTTP-Header für die Autorisierung oder in der Nachricht selbst gesendet werden, z. B. innerhalb eines Elements. Alternativ kann es in einem Nachrichtenattribut enthalten sein. Wählen Sie eine der folgenden Optionen:

Anstelle Ihres Benutzernamens: Passwort geben Sie das Ticket an

Alternativ können Sie diese Informationen wie unten angegeben in den Nachrichtentext oder als Nachrichtenattribut einfügen

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();

BEARBEITEN:

Der Teil "" war mein Beispiel dafür, wo das Ticket verwendet, in einen Textkörper mit mehreren Typen eingefügt und gesendet werden soll. Alternativ kann der Header mit dem WWW-Authenticate-Header gesendet werden

Z.B. Fügen Sie es zu den Optionen auf https.request hinzu

options = {
    host: 'hostname',
    port: 443, 
    'WWW-Authenticate': 'Negotiate ' + ticketdata
};

Google hat einige schöne Diagramme, wie es funktioniert: https://developers.google.com/search-appliance/kb/secure / Kerberos-Diagramm

6
Paul Scheltema 24 Feb. 2014 im 16:15