Ha habido otras preguntas sobre el tema, pero nada parece funcionar para mí.
Tengo un CURL funcional, pero quiero traducirlo a JS (con Node).
curl --user "uername:pass" --digest \ --header "Content-Type: application/json" \ --include \ --request POST "https://cloud.mongodb.com/api/atlas/v1.0/groups/MY_GROUP/clusters/MY_CLUSTER/fts/indexes?pretty=true" \ --data '{ "collectionName": "collname", "database": "myDB", "mappings": { "dynamic": true }, "name": "default" }'
HTTP/2 401 www-authenticate: Digest realm="MMS Public API", domain="", nonce="OtwBmcu89QuyVMLW6FP1W/ZjD3preQl0", algoritmo=MD5, qop="auth", obsoleto=falso tipo de contenido: aplicación/json content-length: 106 x-envoy-upstream-service-time: 2 fecha: miércoles, 16 de febrero de 2022 17:05:37 GMT servidor: enviado
HTTP/2 200 fecha: miércoles, 16 de febrero de 2022 17:05:37 GMT seguridad de transporte estricta: edad máxima = 31536000; incluirSubdominios; política de referencia: origen estricto cuando origen cruzado políticas de dominio cruzado permitidas x: ninguna opciones de tipo de contenido x: nosniff x-mongodb-service-version: gitHash=8284a4ea05955cb13c38df5489a3794b9a691d4f; versionString=v20220216 tipo de contenido: application/json x-frame-options: DENY content-length: 216 x-envoy-upstream-service-time: 154 server: envoy
No estoy seguro de por qué hay un 401 y un 200, pero funciona. Sin embargo, obtengo un 401 sin el indicador --digest
, y ninguna de las soluciones a continuación parece incluir el resumen.
A continuación se muestran todas las formas en que lo intenté, que devuelven 401 "No está autorizado para este recurso".:
fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Basic ' + Buffer.from( 'user:pass' ).toString('base64'), }, body: dataString, } )
Mismo resultado con
const headers = { 'Content-Type': 'application/json', }; var options = { url: url, method: 'POST', headers: headers, body: dataString, auth: { user: 'user', pass: 'pass', }, }; request(options, (error: any, response: any, body: any) => { ... });
const curl = new Curl(); curl.setOpt(Curl.option.HTTPHEADER, [ 'Content-Type: application/json', ]); curl.setOpt(Curl.option.URL, url); curl.setOpt(Curl.option.POST, true); curl.setOpt(Curl.option.USERPWD, 'user:pass'); curl.setOpt(Curl.option.POSTFIELDS, dataString);
Incluso
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "..."); curl_setopt($ch, CURLOPT_USERPWD, 'user:pass'); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); $result = curl_exec($ch); curl_close($ch);
Editar para el paquete request-digest
digestRequest .requestAsync({ host: url, path: urlPath, port: 80, method: 'POST', json: true, headers: { 'Content-Type': 'application/json', }, body: body, }) .then(function (response: any) { console.log(response); }) .catch(function (error: any) { console.log(error); });
Error: solicitud incorrecta, la respuesta está vacía
Debe especificar que se trata de un resumen:
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
Esto es lo que he encontrado aquí :
fetch(url, { ... headers: { 'Authorization': 'Basic ' + Buffer.from(`${username}:${password}`, 'binary').toString('base64') } ... })
Al comparar su código con el código propuesto arriba, veo que falta , 'binary'
en el suyo.
Hay un paquete request-digest que puede ayudarte. Ejemplos (tomados del enlace compartido en este párrafo):
var digestRequest = require('request-digest')('username', 'password'); digestRequest.request({ host: 'http://test.com', path: '/api/v1/test.json', port: 80, method: 'GET', headers: { 'Custom-Header': 'OneValue', 'Other-Custom-Header': 'OtherValue' } }, function (error, response, body) { if (error) { throw error; } console.log(body); });
var digestRequest = require('request-digest')('username', 'password'); digestRequest.requestAsync({ host: 'http://test.com', path: '/api/v1/test.json', port: 80, method: 'GET', excludePort: false, headers: { 'Custom-Header': 'OneValue', 'Other-Custom-Header': 'OtherValue' } }) .then(function (response) { console.log(response.body); }) .catch(function (error) { console.log(error.statusCode); console.log(error.body); });