diff --git a/pages/_app.tsx b/pages/_app.tsx
index 46ea5dd..0aa1cbb 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -1,6 +1,6 @@
-import "styles/globals.css";
-import type { AppProps } from "next/app";
-import Layout from "components/Layout";
+import 'styles/globals.css';
+import type { AppProps } from 'next/app';
+import Layout from 'components/Layout';
function MyApp({ Component, pageProps }: AppProps) {
return (
diff --git a/pages/_document.tsx b/pages/_document.tsx
index c045cfd..9c030f6 100644
--- a/pages/_document.tsx
+++ b/pages/_document.tsx
@@ -1,22 +1,18 @@
-import Document, { Html, Head, Main, NextScript } from "next/document";
+import Document, { Html, Head, Main, NextScript } from 'next/document';
class MyDocument extends Document {
render() {
return (
-
+
+
-
-
+
diff --git a/pages/api/saml/auth.ts b/pages/api/saml/auth.ts
index 67bf527..dfecd8a 100644
--- a/pages/api/saml/auth.ts
+++ b/pages/api/saml/auth.ts
@@ -1,8 +1,8 @@
-import type { NextApiRequest, NextApiResponse } from "next";
+import type { NextApiRequest, NextApiResponse } from 'next';
export async function handler(req: NextApiRequest, res: NextApiResponse) {
- if (req.method === "POST") {
- res.status(200).json({ name: "John Doe" });
+ if (req.method === 'POST') {
+ res.status(200).json({ name: 'John Doe' });
} else {
res.status(405).send(`Method ${req.method} Not Allowed`);
}
diff --git a/pages/saml/sso.tsx b/pages/saml/sso.tsx
index 1143e66..b8bde97 100644
--- a/pages/saml/sso.tsx
+++ b/pages/saml/sso.tsx
@@ -1,13 +1,10 @@
import type { GetServerSideProps } from 'next';
-import React from "react";
-import { AuthNRequest } from '../../types'
-import { extractSAMLRequestAttributes, createResponseForm } from '../../utils'
+import React from 'react';
+import { AuthNRequest } from '../../types';
+import { extractSAMLRequestAttributes, createResponseForm } from '../../utils';
-const ProcessRequest: React.FC = ({relayState, samlRequest}) => {
- return (
- Processing request
- );
-}
+const ProcessRequest: React.FC = ({ relayState, samlRequest }) => {
+ return Processing request
;
+};
export default ProcessRequest;
-
diff --git a/utils/certificate.ts b/utils/certificate.ts
index 30b24fe..a3623a8 100644
--- a/utils/certificate.ts
+++ b/utils/certificate.ts
@@ -7,7 +7,7 @@ const fetchPublicKey = async (): Promise => {
const fetchPrivateKey = async (): Promise => {
return await fs.readFile(path.join('data', 'key.pem'), 'ascii');
-}
+};
const stripCertHeaderAndFooter = (cert: string): string => {
cert = cert.replace(/-+BEGIN CERTIFICATE-+\r?\n?/, '');
@@ -17,8 +17,4 @@ const stripCertHeaderAndFooter = (cert: string): string => {
return cert;
};
-export {
- fetchPublicKey,
- fetchPrivateKey,
- stripCertHeaderAndFooter,
-}
\ No newline at end of file
+export { fetchPublicKey, fetchPrivateKey, stripCertHeaderAndFooter };
diff --git a/utils/idp.ts b/utils/idp.ts
index b83bb91..7bf0d66 100644
--- a/utils/idp.ts
+++ b/utils/idp.ts
@@ -13,7 +13,7 @@ const createIdPMetadataXML = async ({
}): Promise => {
const xmlPath = path.join('data', 'idp-metadata.xml');
const xml = await fs.readFile(xmlPath, 'utf8');
- certificate = stripCertHeaderAndFooter(certificate)
+ certificate = stripCertHeaderAndFooter(certificate);
return xml
.replace('idp_entity_id', idpEntityId)
@@ -21,6 +21,4 @@ const createIdPMetadataXML = async ({
.replace(/idp_sso_url/g, idpSsoUrl);
};
-export {
- createIdPMetadataXML,
-}
\ No newline at end of file
+export { createIdPMetadataXML };
diff --git a/utils/index.ts b/utils/index.ts
index cb79829..943cb83 100644
--- a/utils/index.ts
+++ b/utils/index.ts
@@ -1,4 +1,4 @@
export * from './certificate';
export * from './request';
export * from './response';
-export * from './idp';
\ No newline at end of file
+export * from './idp';
diff --git a/utils/request.ts b/utils/request.ts
index fd63f42..b7cd78c 100644
--- a/utils/request.ts
+++ b/utils/request.ts
@@ -1,6 +1,6 @@
-import xml2js from "xml2js";
-import { promisify } from "util";
-import { inflateRaw } from "zlib";
+import xml2js from 'xml2js';
+import { promisify } from 'util';
+import { inflateRaw } from 'zlib';
const inflateRawAsync = promisify(inflateRaw);
@@ -19,18 +19,16 @@ const parseXML = (xml: string): Promise> => {
// Parse SAMLRequest attributes
const extractSAMLRequestAttributes = async (samlRequest: string) => {
- const request = (
- await inflateRawAsync(Buffer.from(samlRequest, "base64"))
- ).toString();
+ const request = (await inflateRawAsync(Buffer.from(samlRequest, 'base64'))).toString();
const result = await parseXML(request);
- const attributes = result["samlp:AuthnRequest"]["$"];
- const issuer = result["samlp:AuthnRequest"]["saml:Issuer"];
+ const attributes = result['samlp:AuthnRequest']['$'];
+ const issuer = result['samlp:AuthnRequest']['saml:Issuer'];
return {
id: attributes.ID,
acsUrl: attributes.AssertionConsumerServiceURL,
providerName: attributes.ProviderName,
- audience: issuer[0]["_"],
+ audience: issuer[0]['_'],
};
};
diff --git a/utils/response.ts b/utils/response.ts
index ce2b01c..9515e2d 100644
--- a/utils/response.ts
+++ b/utils/response.ts
@@ -5,12 +5,12 @@ import { SignedXml, FileKeyInfo } from 'xml-crypto';
import { pki, util, asn1 } from 'node-forge';
const createResponseXML = async (params: {
- idpIdentityId: string,
- audience: string,
- acsUrl: string,
- user: User
+ idpIdentityId: string;
+ audience: string;
+ acsUrl: string;
+ user: User;
}): Promise => {
- const {idpIdentityId, audience, acsUrl, user} = params;
+ const { idpIdentityId, audience, acsUrl, user } = params;
const authDate = new Date();
const authTimestamp = authDate.toISOString();
@@ -21,46 +21,46 @@ const createResponseXML = async (params: {
authDate.setMinutes(authDate.getMinutes() + 10);
const notAfter = authDate.toISOString();
- const inResponseTo = '_1234'
+ const inResponseTo = '_1234';
const responseId = crypto.randomBytes(10).toString('hex');
const attributeStatement = {
'@xmlns:xs': 'http://www.w3.org/2001/XMLSchema',
'@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
- 'saml:Attribute' : [
+ 'saml:Attribute': [
{
'@Name': 'id',
'@NameFormat': 'urn:oasis:names:tc:SAML:2.0:attrname-format:basic',
'saml:AttributeValue': {
'#text': user.id,
- }
+ },
},
{
'@Name': 'email',
'@NameFormat': 'urn:oasis:names:tc:SAML:2.0:attrname-format:basic',
'saml:AttributeValue': {
'#text': user.email,
- }
+ },
},
{
'@Name': 'firstName',
'@NameFormat': 'urn:oasis:names:tc:SAML:2.0:attrname-format:basic',
'saml:AttributeValue': {
'#text': user.firstName,
- }
+ },
},
{
'@Name': 'lastName',
'@NameFormat': 'urn:oasis:names:tc:SAML:2.0:attrname-format:basic',
'saml:AttributeValue': {
'#text': user.lastName,
- }
+ },
},
- ]
- }
+ ],
+ };
const nodes = {
- 'samlp:Response':{
+ 'samlp:Response': {
'@xmlns:samlp': 'urn:oasis:names:tc:SAML:2.0:protocol',
'@Version': '2.0',
'@ID': responseId,
@@ -69,8 +69,8 @@ const createResponseXML = async (params: {
'@IssueInstant': authTimestamp,
'samlp:Status': {
'samlp:StatusCode': {
- '@Value': 'urn:oasis:names:tc:SAML:2.0:status:Success'
- }
+ '@Value': 'urn:oasis:names:tc:SAML:2.0:status:Success',
+ },
},
'saml:Issuer': {
'@xmlns:saml': 'urn:oasis:names:tc:SAML:2.0:assertion',
@@ -88,7 +88,7 @@ const createResponseXML = async (params: {
'saml:NameID': {
'@Format': 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',
'#text': user.email,
- }
+ },
},
'saml:Conditions': {
'@NotBefore': notBefore,
@@ -96,24 +96,24 @@ const createResponseXML = async (params: {
'saml:AudienceRestriction': {
'saml:Audience': {
'#text': audience,
- }
- }
+ },
+ },
},
'saml:AuthnStatement': {
'@AuthnInstant': authTimestamp,
'@SessionIndex': '_YIlFoNFzLMDYxdwf-T_BuimfkGa5qhKg',
'saml:AuthnContext': {
'saml:AuthnContextClassRef': {
- '#text': 'urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified'
- }
- }
+ '#text': 'urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified',
+ },
+ },
},
'saml:AttributeStatement': attributeStatement,
},
- }
- }
+ },
+ };
- return xmlbuilder.create(nodes).end({ pretty: true});
+ return xmlbuilder.create(nodes).end({ pretty: true });
};
// Create the HTML form to submit the response
@@ -171,8 +171,10 @@ function GetKeyInfo(x509Certificate: string, signatureConfig: any = {}) {
const signResponseXML = async (xml: string, signingKey: any, publicKey: any): Promise => {
const sig = new SignedXml();
- const responseXPath = '/*[local-name(.)="Response" and namespace-uri(.)="urn:oasis:names:tc:SAML:2.0:protocol"]';
- const issuerXPath = '/*[local-name(.)="Issuer" and namespace-uri(.)="urn:oasis:names:tc:SAML:2.0:assertion"]';
+ const responseXPath =
+ '/*[local-name(.)="Response" and namespace-uri(.)="urn:oasis:names:tc:SAML:2.0:protocol"]';
+ const issuerXPath =
+ '/*[local-name(.)="Issuer" and namespace-uri(.)="urn:oasis:names:tc:SAML:2.0:assertion"]';
sig.signatureAlgorithm = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256';
@@ -180,17 +182,17 @@ const signResponseXML = async (xml: string, signingKey: any, publicKey: any): Pr
sig.keyInfoProvider = new GetKeyInfo(publicKey, {});
sig.signingKey = signingKey;
- sig.addReference(responseXPath, ['http://www.w3.org/2000/09/xmldsig#enveloped-signature', 'http://www.w3.org/2001/10/xml-exc-c14n#'], 'http://www.w3.org/2001/04/xmlenc#sha256');
+ sig.addReference(
+ responseXPath,
+ ['http://www.w3.org/2000/09/xmldsig#enveloped-signature', 'http://www.w3.org/2001/10/xml-exc-c14n#'],
+ 'http://www.w3.org/2001/04/xmlenc#sha256'
+ );
sig.computeSignature(xml, {
location: { reference: responseXPath + issuerXPath, action: 'after' },
});
return sig.getSignedXml();
-}
+};
-export {
- createResponseXML,
- createResponseForm,
- signResponseXML
-}
\ No newline at end of file
+export { createResponseXML, createResponseForm, signResponseXML };