This commit is contained in:
Kiran 2022-02-18 11:21:30 +05:30
parent b9e9b53941
commit a8444c434a
5 changed files with 45 additions and 121 deletions

View File

@ -1,50 +0,0 @@
import type { NextApiRequest, NextApiResponse } from 'next';
import type { App, IdPMetadata } from '../../../types';
import prisma from '../../../lib/prisma';
import { createCertificate, createIdPMetadataXML } from '../../../utils';
export default async function handler(
req: NextApiRequest,
res: NextApiResponse<App | App[]>
) {
switch (req.method) {
case 'GET':
return await getAllApps();
case 'POST':
return await createApp();
default:
return res.status(405).end(`Method ${req.method} Not Allowed`);
}
// Get all apps
async function getAllApps() {
const apps = await prisma.app.findMany();
return res.json(apps);
}
// Create a new app
async function createApp() {
const {
name,
acs_url,
entity_id,
description = null,
} = req.body;
const certificate = await createCertificate();
const app = await prisma.app.create({
data: {
name,
acs_url,
entity_id,
description,
certificate,
}
});
return res.json(app);
}
}

View File

@ -1,34 +0,0 @@
import type { NextApiRequest, NextApiResponse } from 'next';
import { User } from '../../../types';
import {
createSAMLResponseXML,
extractSAMLRequestAttributes,
} from '../../../utils';
export default async function handler(
req: NextApiRequest,
res: NextApiResponse<any>
) {
if (req.method === 'POST') {
return await response(req);
}
if (req.method === 'GET') {
const user: User = {
id: '1',
email: 'kiran@demo.com',
firstName: 'Kiran',
lastName: 'K',
};
return res.status(200).json(await createSAMLResponseXML(user));
}
async function response(req: NextApiRequest) {
const { RelayState, SAMLRequest } = req.query;
const attributes = await extractSAMLRequestAttributes(SAMLRequest);
return res.status(200).json(attributes);
}
}

View File

@ -1,28 +0,0 @@
import type { GetServerSideProps } from 'next';
import React from "react";
import { AuthNRequest } from '../../types'
import { extractSAMLRequestAttributes } from '../../utils'
export const getServerSideProps: GetServerSideProps = async ({query, params}) => {
const relayState = query.RelayState as string;
const samlRequest = query.SAMLRequest as string;
const attributes = await extractSAMLRequestAttributes(samlRequest);
console.log(attributes)
return {
props: {
relayState,
samlRequest,
},
}
}
const ProcessRequest: React.FC<AuthNRequest> = ({relayState, samlRequest}) => {
return (
<div>Process Request</div>
);
}
export default ProcessRequest;

View File

@ -0,0 +1,30 @@
import type { GetServerSideProps } from 'next';
import React from "react";
import { AuthNRequest } from '../../types'
import { extractSAMLRequestAttributes } from '../../utils'
export const getServerSideProps: GetServerSideProps = async ({query, params}) => {
const relayState = query.RelayState as string;
const samlRequest = query.SAMLRequest as string;
console.log({samlRequest});
const attributes = await extractSAMLRequestAttributes(samlRequest);
console.log(attributes)
return {
props: {
relayState,
samlRequest,
},
}
}
const ProcessRequest: React.FC<AuthNRequest> = ({relayState, samlRequest}) => {
return (
<div>Processing requjest...</div>
);
}
export default ProcessRequest;

View File

@ -3,13 +3,19 @@ import { promises as fs } from 'fs';
import path from 'path'; import path from 'path';
import xml2js from 'xml2js'; import xml2js from 'xml2js';
import { User } from '../types'; import { User } from '../types';
import config from '../lib/env'; import {promisify} from 'util';
import * as rambda from 'rambda'; import zlib from 'zlib';
const inflateRawSync = promisify(zlib.inflateRawSync)
// Parse XML // Parse XML
const parseXML = (xml: string): Promise<Record<string, any>> => { const parseXML = (xml: string): Promise<Record<string, any>> => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
xml2js.parseString(xml, (err: Error, result: any) => { xml2js.parseString(xml, (err: Error, result: any) => {
if(err) {
reject(err);
}
resolve(result); resolve(result);
}); });
}); });
@ -17,15 +23,15 @@ const parseXML = (xml: string): Promise<Record<string, any>> => {
// Parse SAMLRequest attributes // Parse SAMLRequest attributes
const extractSAMLRequestAttributes = async (samlRequest: string) => { const extractSAMLRequestAttributes = async (samlRequest: string) => {
// @ts-ignore // const request = await inflateRawSync(Buffer.from(samlRequest, 'base64')).toString();
const result = await parseXML(Buffer.from(samlRequest, 'base64').toString()); // const result = await parseXML(request);
const attributes = result['samlp:AuthnRequest']['$'];
// const attributes = result['samlp:AuthnRequest']['$'];
return { return {
id: attributes['ID'], id: '123',
issueInstant: attributes['IssueInstant'], acsUrl: 'https://hookb.in/NOrYqkDLnXse8mNNlDXx',
acsUrl: attributes['AssertionConsumerServiceURL'], providerName: 'BoxyHQ',
providerName: attributes['ProviderName'],
}; };
}; };