We need to add both a SSL and a X509 Certificate in node-soap. Is possible?
SSL Certificate
client.setSecurity(new soap.ClientSSLSecurityPFX(
'./xxxxxxx.p12',
'passw',
{strictSSL: false,
rejectUnauthorized: false,
//secureOptions: require('constants').SSL_OP_NO_TLSv1_2
}));
and WS-Security X509 Certificate
Thanks,
Pablo
var auth =
'Basic ' + Buffer.from('419984' + ':' + 'Credi9').toString('base64');
var options = {
wsdl_options: {
pfx: fs.readFileSync(__dirname + '/../creditoApp.pfx'),
rejectUnauthorized: false,
passphrase: 'creditoApp',
},
wsdl_headers: { Authorization: auth },
};
soap
.createClientAsync(url, options)
.then((client) => {
log(client.describe());
log(
client.ProspectaPlusWSService.ProspectaPlus.consultaProspecta(args),
);
//return client.consultaProspecta(args);
})
.then((result) => {});
callback(error, result, rawResponse, soapHeader, rawRequest);
^
TypeError: callback is not a function
Any help why I am gettig this error var request = require('request');
var soap = require('soap');
const fs = require('fs')
const path = require('path');
const https = require('https');
var options = {
'method': 'POST',
wsdl_options: {
forever: true,
rejectUnauthorized: false,
strictSSL: false,
pfx: fs.readFileSync(path.join(__dirname, 'key/cis-client-dev.pfx')),
passphrase: 'client@123!',
secureProtocol : 'TLSv1_2_method',
gzip : true,
// key: fs.readFileSync('./cis-client-dev-key.pem', 'utf8'),
// cert: fs.readFileSync('./cis-client-dev.cer', 'utf8')
},
wsdl_headers: {
'Content-Type': 'text/xml',
'Authorization': 'uat_admin',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive'
},
body: '<XML part>'
};
var url = 'https://gateway.integr-test.domain.uk:port/test/services/DocumentUploadService'
soap.createClient(url, options, function (err, client) {
console.log('Error' + err);
console.log('Response back from DRS: ' + client);
});
Error
ErrorError: Invalid WSDL URL: https://gateway.integr-url/test/services/DocumentUploadService
Code: 500
Response Body: <faultstring>The endpoint reference (EPR) for the Operation not found is /test/services/DocumentUploadService and the WSA Action = null. If this EPR was previously reachable, please contact the server administrator.</faultstring>
Response back from DRS: undefined
Hello, I have a .NET application with a SOAP client with the following custom binding. Is it possible to rewrite this custom binding using node-soap? I have tried Python libraries zeep and suds and it did not work, probably because it does not fully support the specified settings. Is it possible to configure the node-soap to be compliant with the following settings? I am especially concerned by the MutualCertificate mode. Thank you.
<binding name="X">
<security defaultAlgorithmSuite="Basic128" authenticationMode="MutualCertificate" enableUnsecuredResponse="true" requireDerivedKeys="false" includeTimestamp="true" messageProtectionOrder="EncryptBeforeSign" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10" requireSignatureConfirmation="false">
<localClientSettings detectReplays="false" />
<localServiceSettings detectReplays="false" />
</security>
<textMessageEncoding messageVersion="Soap11" />
<httpsTransport authenticationScheme="Basic" />
</binding>
client.lastRequest
, it works perfectly fine. node-soap just returns an empty response
return {
getMetadataResult: {
index: 0,
count: 1,
total: 1,
mediaCollection: {
id: "trending",
itemType: "container",
title: "Trending",
},
mediaCollection: {
id: "new",
itemType: "container",
title: "New",
},
},
};
let client = await soap.createClientAsync(this.environmentUrl, {
ignoreBaseNameSpaces: true,
overrideRootElement: {
namespace: 'fac:',
xmlnsAttributes: [{
name: 'xmlns:fac',
value: "http://www.facturante.com.API"
},{
name: 'xmlns:fac1',
value: "http://schemas.datacontract.org/2004/07/FacturanteMVC.API"
}, {
name: 'xmlns:fac2',
value: "http://schemas.datacontract.org/2004/07/FacturanteMVC.API.DTOs"
}]
},
/*ignoredNamespaces: {
namespaces: ['targetNamespace', 'typedNamespace', 'tns', 'wsu', 'msc', 'i0'],
override: true
}*/
});
client.addHttpHeader('Content-Type', 'application/soap+xml; charset=utf-8');
client.addHttpHeader('Connection', 'Keep-Alive');
let resp = await client.CrearComprobanteAsync({
//'fac:CrearComprobante': {
'fac:request': {
'fac1:Autenticacion': this.parseSecondLevelObj(data.Autenticacion),
'fac1:Cliente': this.parseSecondLevelObj(data.Cliente),
'fac1:Encabezado': this.parseSecondLevelObj(data.Encabezado),
'fac1:Items': [ ...data.Items.map((item, i) => {
return { 'fac2:ComprobanteItem': this.parseSecondLevelObj(item) }
}) ]
}
//}
/*...data,
Items: data.Items.map((item, i) => {
return { ComprobanteItem: {...item} }
})*/
});
I tried to delete the next line too:
client.addHttpHeader('Content-Type', 'application/soap+xml; charset=utf-8');
But the service returns error 415
httpntlm
from the dependencies? We're getting security warnings bc of httpntlm
s dependency underscore
and unfortunately httpntlm
wasn't updated the last 3 years so I don't think they're going to update their package any time soon. Any thoughts on this? Sorry if this has been posted already!
@vpulim
Hi Vinay,
First, thank you for the great job you did with this library. I forked your code to add a test involving a very complex WSDL (WSDLs import, XSD with different namespace, complex types inheritence, etc.) :
stondini/node-soap@533ff7c
I'm not a JavaScript developer so it's hard to figure out the issue but the request seems not to be generated with the correct namespaces.
The request XML is not generated as expect.
Did you already face this kind of issue ?
httpntlm
package was recently merged: SamDecrock/node-http-ntlm#93
Hi Guys, can't seem to get the unit tests running on the project on master with no changes, eg after npm i, then npm run test I get the folllow error:
should allow customization of httpClient and the wsdl file download should pass through it: Uncaught AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
,
currently running node 16.1.0
Hi James, @allout58 did you solved this issue? cause I am facing the same problem right now. Any one can help please!
Hi, I've got a problem creating the client. I've been able to get it working with another WSDL, but on pointing it to the new WSDL, it crashes with the following stacktrace
TypeError: Cannot read property 'postProcess' of undefined
at subElement.OperationElement.postProcess (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:651:12)
at subElement.PortTypeElement.postProcess (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:671:11)
at subElement.BindingElement.postProcess (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:685:14)
at subElement.ServiceElement.postProcess (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:721:17)
at C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:1038:26
at WSDL._processNextInclude (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:1158:12)
at WSDL.processIncludes (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:1201:8)
at C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:1028:10
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
at new WSDL (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:1021:11)
at C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:2246:16
at Request._callback (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\http.js:117:5)
at Request.self.callback (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\request\request.js:188:22)
at emitTwo (events.js:106:13)
at Request.emit (events.js:191:7)
at Request.<anonymous> (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\request\request.js:1171:10)
at emitOne (events.js:96:13)
at Request.emit (events.js:188:7)
at IncomingMessage.<anonymous> (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\request\request.js:1091:12)
at emitNone (events.js:91:20)
at Request.init (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\request\request.js:191:10)
at new Request (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\request\request.js:130:8)
at HttpClient.request [as _request] (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\request\index.js:54:10)
at HttpClient.request (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\http.js:112:18)
at open_wsdl (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\wsdl.js:2242:16)
at C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\soap.js:21:7
at _requestWSDL (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\soap.js:47:5)
at createClient (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\soap.js:58:3)
at C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\soap\lib\soap.js:68:5
at Promise._execute (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\bluebird\js\release\debuggability.js:303:9)
at Promise._resolveFromExecutor (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\bluebird\js\release\promise.js:483:18)
at new Promise (C:\Users\jhollowell\WebProjects\swampticket2-backend\node_modules\bluebird\js\release\promise.js:79:10)`
const message = {
Header: { ... },
Details: { .... },
attributes: { version: 3.1 },
}
my version attribute is added to the XML without the namespace. What am I doing wrong?
Hi all - noob question here... trying to access a public url ('http://dataaccess.com/webservicesserver/NumberConversion.wso'
) and I've got the following code:
const options = {
wsdl_options: {
forever: true,
rejectUnauthorized: false,
strictSSL: false,
},
wsdl_headers: {
'Content-Type': 'application/json; charset=utf-8',
'Content-Length': 'length'
},
}
let argument = {'ubiNum': '20'}
soap.createClientAsync(url, options)
.then((client) => {
return client.NumberToWords(argument)
})
.then((resp) => {
console.log('hello again', resp)
})
.catch((err) => {
console.log('message', err.message)
return err
})
But I'm getting a 400 error stating Invalid WSDL URL: http://dataaccess.com/webservicesserver/NumberConversion.wso
I was previously getting a 401 error with the same message until I added the quotes to the argument object.
Any advice would be greatly appreciated, I'm pretty stuck :(