Lorsque vous utilisez node.js en tant que client, est-il possible de se connecter à un serveur à l'aide de l'authentification intégrée Windows (par exemple, lors de la connexion à IIS)?
Mes recherches ne font que générer des résultats là où node.js est utilisé en tant que serveur.
Mise à jour: Certains modules implémentent maintenant l'authentification intégrée à Windows. node-sspi utilise SSPI (l'API de sécurité Windows) pour gérer le côté serveur de choses, mais ne fait pas l'authentification du client . Il existe plusieurs implémentations client telles que http-ntlm , mais elles ne sont pas réellement intégrées car elles nécessitent le mot de passe de l'utilisateur. n'utilisez pas SSPI pour effectuer une authentification transparente.
"Authentification intégrée Windows" est ce qu'on appelle l'authentification NTLM. Lorsque vous recevez un HTTP 401 de IIS avec un en-tête WWW-Authenticate
contenant NTLM
, vous avez maintenant le plaisir d'implémenter le protocole d'authentification NTLM. Citant ce document sur le protocole d’authentification NTLM :
Le client demande une ressource protégée au serveur:
GET /index.html HTTP/1.1
Le serveur répond avec un statut 401
, indiquant que le client doit s'authentifier. NTLM
est présenté comme un mécanisme d'authentification pris en charge via l'en-tête WWW-Authenticate
. En règle générale, le serveur ferme la connexion à ce moment:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: NTLM
Connection: close
Notez qu'Internet Explorer ne sélectionnera NTLM que s'il s'agit du premier mécanisme proposé. Cela est contraire à la norme RFC 2616, qui stipule que le client doit sélectionner le schéma d'authentification pris en charge le plus puissant.
Le client soumet à nouveau la demande avec un en-tête Authorization
contenant un paramètre Type 1 message . Le message de type 1 est codé en Base 64 pour la transmission. À partir de ce moment, la connexion est maintenue ouverte. la fermeture de la connexion nécessite la réauthentification des demandes suivantes. Cela implique que le serveur et le client doivent prendre en charge les connexions persistantes, via l'en-tête "Keep-Alive" de type HTTP 1.0 ou HTTP 1.1 (dans lequel les connexions persistantes sont utilisées par défaut). Les en-têtes de requête pertinents apparaissent comme suit:
GET /index.html HTTP/1.1
Authorization: NTLM TlRMTVNTUAABAAAABzIAAAYABgArAAAACwALACAAAABXT1JLU1RBVElPTkRPTUFJTg==
Le serveur répond avec un état 401
contenant un message de type 2 dans l'en-tête WWW-Authenticate
(à nouveau, codé en Base 64). Ceci est montré ci-dessous.
HTTP/1.1 401 Unauthorized
WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADAAAAABAoEAASNFZ4mrze8AAAAAAAAAAGIAYgA8AAAARABPAE0AQQBJAE4AAgAMAEQATwBNAEEASQBOAAEADABTAEUAUgBWAEUAUgAEABQAZABvAG0AYQBpAG4ALgBjAG8AbQADACIAcwBlAHIAdgBlAHIALgBkAG8AbQBhAGkAbgAuAGMAbwBtAAAAAAA=
Le client répond au message de type 2 en soumettant à nouveau la demande avec un en-tête Authorization
contenant un message de type 3 codé en Base 64 :
GET /index.html HTTP/1.1
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAGoAAAAYABgAggAAAAwADABAAAAACAAIAEwAAAAWABYAVAAAAAAAAACaAAAAAQIAAEQATwBNAEEASQBOAHUAcwBlAHIAVwBPAFIASwBTAFQAQQBUAEkATwBOAMM3zVy9RPyXgqZnr21CfG3mfCDC0+d8ViWpjBwx6BhHRmspst9GgPOZWPuMITqcxg==
Enfin, le serveur valide les réponses dans le message de type 3 du client et autorise l'accès à la ressource.
HTTP/1.1 200 OK
Vous devrez trouver comment répondre au défi du message de type 2 , où le mot de passe de l'utilisateur est haché MD4 et utilisé pour créer les clés DES. pour chiffrer les données du challenge.
Je ne sais pas comment vous obtiendrez l'accès aux données d'identification de l'utilisateur connecté qui vous permettrait d'accomplir cela, bien que cela implique de rédiger un addon C++ natif afin que vous puissiez parler à l'API Windows nécessaire. Ou, je suppose que vous pourriez simplement demander le mot de passe de l'utilisateur.
Alternativement, vous pouvez proxyer vos requêtes Node via un logiciel gérant le désordre NTLM pour vous .
Pour Kerberos:
noeud-sspi
Just on windows
No client side node
Supports NTLM too
passeport-negocier
Needs python on the server
it's a passportJs strategy
Pour NTLM
noeud-sspi
Just on windows
No client side node
Supports Kerberos too
ntlm
experimental project!
ntlm-auth
experimental!
passeport-ntlm
supports SMB protocol
it's a passportJs strategy
J'ai choisi passeport-négocier pour Kerberos et express-ntlm pour NTLM
Pour le côté client, l’utilisation de node-libcurl pour les appels REST/HTTP.
voici un exemple de code:
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();