mocksaml/pages/api/saml/sso.ts

54 lines
1.6 KiB
TypeScript
Raw Normal View History

2022-02-21 05:52:12 +00:00
import type { NextApiRequest, NextApiResponse } from 'next';
import saml from '@boxyhq/saml20';
2022-02-21 05:52:12 +00:00
2022-02-22 05:36:06 +00:00
export default async function handler(req: NextApiRequest, res: NextApiResponse<string>) {
2022-02-21 05:52:12 +00:00
switch (req.method) {
case 'GET':
2022-02-24 16:36:25 +00:00
return await processSAMLRequest(req, res, false);
case 'POST':
return await processSAMLRequest(req, res, true);
2022-02-21 05:52:12 +00:00
default:
return res.status(405).end(`Method ${req.method} Not Allowed`);
}
2022-02-24 16:36:25 +00:00
}
2022-02-21 05:52:12 +00:00
2022-02-24 16:36:25 +00:00
async function processSAMLRequest(req: NextApiRequest, res: NextApiResponse, isPost: boolean) {
let samlRequest, relayState, isDeflated;
2022-02-24 16:36:25 +00:00
if (isPost) {
relayState = req.body.RelayState;
samlRequest = req.body.SAMLRequest;
isDeflated = false;
} else {
relayState = req.query.RelayState;
samlRequest = req.query.SAMLRequest;
// sigAlg = req.query.SigAlg;
// signature = req.query.Signature;
2022-02-24 16:36:25 +00:00
isDeflated = true;
}
2022-02-24 16:36:25 +00:00
try {
const rawRequest = await saml.decodeBase64(samlRequest, isDeflated);
const { id, audience, acsUrl, providerName, publicKey } = await saml.parseSAMLRequest(rawRequest, isPost);
if (isPost) {
const { valid } = await saml.hasValidSignature(rawRequest, publicKey, null);
if (!valid) {
throw new Error('Invalid signature');
}
}
2022-02-24 16:36:25 +00:00
const params = new URLSearchParams({ id, audience, acsUrl, providerName, relayState });
2022-02-23 13:48:20 +00:00
2024-01-21 01:01:09 +00:00
const loginUrl = (req.query.namespace ? `/namespace/${req.query.namespace}` : '') + '/saml/login';
res.redirect(302, `${loginUrl}?${params.toString()}`);
2022-02-24 16:36:25 +00:00
} catch (err) {
console.error(err);
2022-02-23 13:48:20 +00:00
res.status(500).send(`${err}`);
2022-02-21 05:52:12 +00:00
}
2022-02-22 05:36:06 +00:00
}