UNPKG

@node-saml/node-saml

Version:

SAML 2.0 implementation for Node.js

116 lines 5.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateServiceProviderMetadata = void 0; const crypto_1 = require("./crypto"); const types_1 = require("./types"); const utility_1 = require("./utility"); const xml_1 = require("./xml"); const crypto_2 = require("./crypto"); const constants_1 = require("./constants"); const generateServiceProviderMetadata = (params) => { const { issuer, callbackUrl, logoutCallbackUrl, decryptionPvk, privateKey, metadataContactPerson, metadataOrganization, identifierFormat = constants_1.DEFAULT_IDENTIFIER_FORMAT, wantAssertionsSigned = constants_1.DEFAULT_WANT_ASSERTIONS_SIGNED, // This matches the default used in the `SAML` class. generateUniqueId = crypto_2.generateUniqueId, } = params; let { publicCerts, decryptionCert } = params; if (decryptionPvk != null) { if (!decryptionCert) { throw new Error("Missing decryptionCert while generating metadata for decrypting service provider"); } } else { decryptionCert = null; } if (privateKey != null) { if (!publicCerts) { throw new Error("Missing publicCert while generating metadata for signing service provider messages"); } publicCerts = !Array.isArray(publicCerts) ? [publicCerts] : publicCerts; } else { publicCerts = null; } const metadata = { EntityDescriptor: { "@xmlns": "urn:oasis:names:tc:SAML:2.0:metadata", "@xmlns:ds": "http://www.w3.org/2000/09/xmldsig#", "@entityID": issuer, "@ID": generateUniqueId(), SPSSODescriptor: { "@protocolSupportEnumeration": "urn:oasis:names:tc:SAML:2.0:protocol", "@AuthnRequestsSigned": "false", }, ...(metadataOrganization ? { Organization: metadataOrganization } : {}), ...(metadataContactPerson ? { ContactPerson: metadataContactPerson } : {}), }, }; if (decryptionCert != null || publicCerts != null) { metadata.EntityDescriptor.SPSSODescriptor.KeyDescriptor = []; if ((0, types_1.isValidSamlSigningOptions)(params)) { (0, utility_1.assertRequired)(publicCerts, "Missing publicCert while generating metadata for signing service provider messages"); metadata.EntityDescriptor.SPSSODescriptor["@AuthnRequestsSigned"] = true; const certArray = Array.isArray(publicCerts) ? publicCerts : [publicCerts]; const signingKeyDescriptors = certArray.map((cert) => ({ "@use": "signing", "ds:KeyInfo": { "ds:X509Data": { "ds:X509Certificate": { "#text": (0, crypto_1.stripPemHeaderAndFooter)(cert), }, }, }, })); metadata.EntityDescriptor.SPSSODescriptor.KeyDescriptor.push(signingKeyDescriptors); } if (decryptionPvk != null) { (0, utility_1.assertRequired)(decryptionCert, "Missing decryptionCert while generating metadata for decrypting service provider"); decryptionCert = (0, crypto_1.stripPemHeaderAndFooter)(decryptionCert); metadata.EntityDescriptor.SPSSODescriptor.KeyDescriptor.push({ "@use": "encryption", "ds:KeyInfo": { "ds:X509Data": { "ds:X509Certificate": { "#text": decryptionCert, }, }, }, EncryptionMethod: [ // this should be the set that the xmlenc library supports { "@Algorithm": "http://www.w3.org/2009/xmlenc11#aes256-gcm" }, { "@Algorithm": "http://www.w3.org/2009/xmlenc11#aes128-gcm" }, { "@Algorithm": "http://www.w3.org/2001/04/xmlenc#aes256-cbc" }, { "@Algorithm": "http://www.w3.org/2001/04/xmlenc#aes128-cbc" }, ], }); } } if (logoutCallbackUrl != null) { metadata.EntityDescriptor.SPSSODescriptor.SingleLogoutService = { "@Binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", "@Location": logoutCallbackUrl, }; } if (identifierFormat != null) { metadata.EntityDescriptor.SPSSODescriptor.NameIDFormat = identifierFormat; } if (wantAssertionsSigned) { metadata.EntityDescriptor.SPSSODescriptor["@WantAssertionsSigned"] = true; } metadata.EntityDescriptor.SPSSODescriptor.AssertionConsumerService = { "@index": "1", "@isDefault": "true", "@Binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", "@Location": callbackUrl, }; let metadataXml = (0, xml_1.buildXmlBuilderObject)(metadata, true); if (params.signMetadata === true && (0, types_1.isValidSamlSigningOptions)(params)) { metadataXml = (0, utility_1.signXmlMetadata)(metadataXml, { privateKey: params.privateKey, signatureAlgorithm: params.signatureAlgorithm, xmlSignatureTransforms: params.xmlSignatureTransforms, digestAlgorithm: params.digestAlgorithm, }); } return metadataXml; }; exports.generateServiceProviderMetadata = generateServiceProviderMetadata; //# sourceMappingURL=metadata.js.map