diff --git a/package-lock.json b/package-lock.json index fca5434..4a253b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "next": "12.0.7", "react": "17.0.2", "react-dom": "17.0.2", + "xml2js": "^0.4.23", "xmlbuilder": "^15.1.1" }, "devDependencies": { @@ -5197,6 +5198,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -5971,6 +5977,26 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", @@ -9807,6 +9833,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -10403,6 +10434,22 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + } + } + }, "xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", diff --git a/package.json b/package.json index 406f7ec..6610461 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "next": "12.0.7", "react": "17.0.2", "react-dom": "17.0.2", + "xml2js": "^0.4.23", "xmlbuilder": "^15.1.1" }, "devDependencies": { diff --git a/pages/api/apps/saml.ts b/pages/api/apps/saml.ts index fb3bdaf..460748b 100644 --- a/pages/api/apps/saml.ts +++ b/pages/api/apps/saml.ts @@ -1,4 +1,26 @@ import type { NextApiRequest, NextApiResponse } from 'next'; +import xml2js from 'xml2js'; + +const parseXML = (xml: string): Promise> => { + return new Promise((resolve, reject) => { + xml2js.parseString(xml, (err: Error, result: any) => { + resolve(result); + }); + }); +}; + +const extractSAMLRequestAttribute = async (SAMLRequest: string | string[]) => { + // @ts-ignore + const result = await parseXML(Buffer.from(SAMLRequest, 'base64').toString()); + const sp = result['samlp:AuthnRequest']['$']; + + return { + ID: sp['ID'], + IssueInstant: sp['IssueInstant'], + AssertionConsumerServiceURL: sp['AssertionConsumerServiceURL'], + ProviderName: sp['ProviderName'], + }; +}; export default async function handler( req: NextApiRequest, @@ -11,14 +33,8 @@ export default async function handler( async function response(req: NextApiRequest) { const { RelayState, SAMLRequest } = req.query; - // @ts-ignore - const samlRequest = Buffer.from(SAMLRequest, 'base64').toString(); + const attributes = await extractSAMLRequestAttribute(SAMLRequest); - // @ts-ignore - // const a = Buffer.from(SAMLRequest, 'base64'); - // const b = pako.inflateRaw(a, { to: 'string' }); - // const samlRequest = Buffer.from(SAMLRequest, 'base64').toString('hex'); - - return res.status(200).json({ samlRequest }); + return res.status(200).json(attributes); } } diff --git a/services/metadata.ts b/services/metadata.ts index b001a6d..1b7d02d 100644 --- a/services/metadata.ts +++ b/services/metadata.ts @@ -20,7 +20,7 @@ export const create = ( }; }; -const formatCert = (certificate: string) => { +const extractCert = (certificate: string) => { return certificate .replace('-----BEGIN CERTIFICATE-----', '') .replace('-----END CERTIFICATE-----', '') @@ -48,7 +48,7 @@ export const createXML = async ( '@xmlns:ds': 'http://www.w3.org/2000/09/xmldsig#', 'ds:X509Data': { 'ds:X509Certificate': { - '#text': `${formatCert(certificate)}`, + '#text': `${extractCert(certificate)}`, }, }, },