Added some msal stuffs!

This commit is contained in:
Donavon McDowell 2024-12-10 20:24:37 -07:00
parent f11a7b3fb0
commit ab8c478567
8 changed files with 471 additions and 9 deletions

View File

@ -1,12 +1,13 @@
// Required modules
const express = require('express');
const { MongoClient, ObjectId } = require('mongodb');
const cors = require('cors');
// Set up express app
const app = express();
const port = process.env.PORT || 3000;
const mongodb_uri = process.env.MONGODB_URI || 'mongodb://localhost:27017';
const mongodb_name = process.env.MONGODB_NAME || 'docucenter';
// Parse JSON bodies
app.use(express.json({ limit: '50mb' })); // For JSON data
@ -16,8 +17,8 @@ app.use(express.urlencoded({ limit: '50mb', extended: true })); // For URL-encod
app.use(cors());
// MongoDB configuration
const mongoUri = 'mongodb://localhost:27017'; // Replace with your MongoDB URI
const dbName = 'docucenter';
const mongoUri = mongodb_uri;
const dbName = mongodb_name;
let db;
// Connect to MongoDB

17
backend/certs/example.crt Normal file
View File

@ -0,0 +1,17 @@
-----BEGIN CERTIFICATE-----
MIICqDCCAZACCQDWxJavO1DzuTANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtl
eGFtcGxlLmNvbTAeFw0yMjA2MTIyMDA2NDlaFw0yMzA2MTIyMDA2NDlaMBYxFDAS
BgNVBAMMC2V4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAp4SkpX3eIN58eh/oNbiWofs7//rztEwEfzTzBB0apgUj/4hQh1dgIvZIio2k
m8Cqo/IxUT7iT3thgH21aYB8bXdNxjAW1zqdHsqONaktImoTswJq7GNlIKVbhUAo
jBm4N9Qq9FaIwwIB7wV2CQbl2+z+u6vMUiG+H8DjnVHUmGvCGlJ5//4ZFLNutz9t
W+7G6fwRin7yrhWSxYnVPWJKtUCqWxykxErMvOBQS466SmihIqCMaZgF4E1DMPqg
PQfzqDyJlq6GlmISiAUe/hKEIXA+GZCKueO3k4enfRq9JdvGUxehy5H9PbHXzg8J
hQ0AklYwI58GCKCWzlcCpL5AcwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQADRUBh
eLMSHqIkzyWxlCRTIDFovRbE5bCws0yeQHlmY6wN+uWKWMATC5gqM2g6b7TMrc13
PQEUIo+lO9Ypf1QrNd6bJm3FQc+exu7J+WohkjkY5DG321oBCMhHvRImtj5AoEq5
0Vk+sQx7t++lh0/dT6YFC5EaGklsbjq3uuTBmlyWortQiYSro0MIqbXxTV6Eo1gM
7/AJaLAe36T85s5KMlkmXUpvQHx4FKiIq2Y8UMww/Jv8Ggn6tJwYeuwUJlt51Q6C
7QNzhKJOB5otM1y6GsI675a50i/QSfh7Ku1hfcVX8UYDTvSrdgnru21XqpVmmY59
bAwE/uaqeobm0plH
-----END CERTIFICATE-----

28
backend/certs/example.key Normal file
View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnm4VM1u0oX2Am
grdvZBfX7Rb9LN60zze4zdrjU3R0WhyfIYF1jECfjpFTdro3ieKXBW+isrcXLOvk
LUcgIxL48iCAy8wSLwkSzxM9XPyxqunZQL7T/bEv0U5w5Zb4y0jUlEVIeUhRlp7k
5emM0aArRGWTZJCKXsr/aab5wQ3YnAQGnGmnMaTGIBCKX2lCzlEJ+jkOMiobDUe3
4BzIriZ4TPlNeGYTVA7mmHehDtnZB0sJ8Qqw0hyWLNwm9bhcpcfX6Qkh9WYncPP/
DUorswEEuUrtYSpVpU6REmljMB67+92sqm+dHO2zJcaV5YzwmFnEGgEqCuJ+8BIK
JBLaejrFAgMBAAECggEBAIC9SVdrIwDGuZD7CLEL3fCiEO1ooKubGv7dR8si2Cli
6eclEk5a62xjUqccZA6y35QGvefnhBDOFWbPjHlX14PWXzbu0xIIhNyop+uTWBmT
4UlZnPoyO/4xtCGtiBgT9R4rwUfYuL7KhcPmAU2D2pZBVBAxx4AxLZWf7nyaV+tP
NFUVjegiJOl/iqP/aXVWw362TwOvJMalTWHRuVf1CcF5VkHKzT3lLIaTu1QbevEC
o5iGBc0EJfY56ZwvPZVsSFQ+wEBCimOPxsDJkaC/cPYf68SpOULQnRTSGYQ1WuWy
/guatJ3SyDzb2sqAg13VG+olEyy8ovNOIp4YL/qaCqUCgYEA29YuOo3T7lvaf7UX
t93qs5jxc2H3RXUrcP4NUDOxbhecunKKVrGRoGTcxqtdRFllx2vbd2wIM4K6tyMq
cgNqTlFpqoKBwNZwaevVlp2NtpqkFunqYp4X4rHOnZeAJDCqjhfVIGtxtQsLnWJt
VTDbpGgC/mKO+oofZMaM33JQ198CgYEAwy3aRYxUPjsYnTf9Xu8EC9ScGJJmXzxK
h3Zbvw0QhlLKDQLoKnGHD6hyqzLbs7bXaZgV1ot7l/MolqUrJKNrqpZ50E9CXSB+
3f5TGuq2Qo85FQJdlPAZVbEksPpnVione9e8Ccyl5X617qUB43hQTTt/MPJQsi1e
61D98XV8UdsCgYB8ue0qnZNTllvGvzlAwbDKywiavUds6giGqC1nhpyxaMYsZpYk
j8Se6vrz4QAeqlX7qi8vd2TDzPUguNv5KgTjgH9iFX+GqGPJRNu/A48GvoBA2+B2
qVnF7bnbYbx7S/1Idy8doLg3zpd9aP29KuZDRhwEtmiGr10WcSw2DobdowKBgALc
rEOy0BVthmnfxU5cEOIfhv5xPyEMYEdmO+gsR97AXggcz8y3h3R6Utwhzcjv2G7K
9R8FQpWy0hiLaXuLDewdcsHUN7Pn4xRcQ1m0sWF+eibNtxOVBboU8+XIdjV0Psn5
Gt/F6XTZC8/pCYMNY5gOVEoic355XdfzgxXEVENbAoGAVVFdB4UxKF5au2JlwpPR
zdP4nYu/6fJEhKzVxkpf99Yxv9j0I8IDea4dxRZe0aChuG5oU4/st7vAihavp5a8
2LQUOsKOvHvu3qNb5Y9a5PGR5Zq43H/2zdA+EVLjNqksCmynmuZDEStJjg5hnjYF
uAm3FeZxe8R8VP9NvMoP4wY=
-----END PRIVATE KEY-----

102
backend/msal.js Normal file
View File

@ -0,0 +1,102 @@
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
const fs = require('fs');
const crypto = require('crypto');
const express = require('express');
const msal = require('@azure/msal-node');
/**
* If you have encrypted your private key with a *pass phrase* as recommended,
* you'll need to decrypt it before passing it to msal-node for initialization.
*/
// Secrets should never be hardcoded. The dotenv npm package can be used to store secrets or certificates
// in a .env file (located in project's root directory) that should be included in .gitignore to prevent
// accidental uploads of the secrets.
// Certificates can also be read-in from files via NodeJS's fs module. However, they should never be
// stored in the project's directory. Production apps should fetch certificates from
// Azure KeyVault (https://azure.microsoft.com/products/key-vault), or other secure key vaults.
// Please see "Certificates and Secrets" (https://learn.microsoft.com/azure/active-directory/develop/security-best-practices-for-app-registration#certificates-and-secrets)
// for more information.
const privateKeySource = fs.readFileSync('./certs/example.key');
const privateKeyObject = crypto.createPrivateKey({
key: privateKeySource,
passphrase: "2255", // enter your certificate passphrase here
format: 'pem'
});
const privateKey = privateKeyObject.export({
format: 'pem',
type: 'pkcs8'
});
// Before running the sample, you will need to replace the values in the config
const config = {
auth: {
clientId: "3cdfac60-e7fb-4648-89d3-67966c497d35", //Client ID
authority: "https://login.microsoftonline.com/538b9b1c-23fa-4102-b36e-a4d83fc9c4c1", //Tenant ID
clientCertificate: {
thumbprint: 'DD79B973F2D634840948970C712907DF4423C982', // can be obtained when uploading certificate to Azure AD
privateKey: privateKey,
}
},
system: {
loggerOptions: {
loggerCallback(loglevel, message, containsPii) {
console.log(message);
},
piiLoggingEnabled: false,
logLevel: msal.LogLevel.Verbose,
}
}
};
// Create msal application object
const cca = new msal.ConfidentialClientApplication(config);
// Create Express app
const app = express();
app.use(express.urlencoded({ extended: false }));
app.get('/', (req, res) => {
const authCodeUrlParameters = {
scopes: ["user.read"],
redirectUri: "http://localhost:3000/redirect",
responseMode: 'form_post',
};
// get url to sign user in and consent to scopes needed for application
cca.getAuthCodeUrl(authCodeUrlParameters).then((response) => {
console.log(response);
res.redirect(response);
}).catch((error) => console.log(JSON.stringify(error)));
});
app.post('/redirect', (req, res) => {
const tokenRequest = {
code: req.body.code,
scopes: ["user.read"],
redirectUri: "http://localhost:3000/redirect",
};
cca.acquireTokenByCode(tokenRequest).then((response) => {
console.log("\nResponse: \n:", response);
res.status(200).send('Congratulations! You have signed in successfully');
}).catch((error) => {
console.log(error);
res.status(500).send(error);
});
});
const SERVER_PORT = process.env.PORT || 3000;
app.listen(SERVER_PORT, () => {
console.log(`Msal Node Auth Code Sample app listening on port ${SERVER_PORT}!`)
});

View File

@ -9,11 +9,37 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@azure/msal-node": "^2.16.2",
"body-parser": "^1.20.3",
"cors": "^2.8.5",
"dotenv": "^16.4.7",
"express": "^4.21.2",
"mariadb": "^3.4.0",
"mongodb": "^6.12.0"
"mongodb": "^6.12.0",
"redis": "^4.7.0"
}
},
"node_modules/@azure/msal-common": {
"version": "14.16.0",
"resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz",
"integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==",
"license": "MIT",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/@azure/msal-node": {
"version": "2.16.2",
"resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.2.tgz",
"integrity": "sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==",
"license": "MIT",
"dependencies": {
"@azure/msal-common": "14.16.0",
"jsonwebtoken": "^9.0.0",
"uuid": "^8.3.0"
},
"engines": {
"node": ">=16"
}
},
"node_modules/@mongodb-js/saslprep": {
@ -24,6 +50,65 @@
"sparse-bitfield": "^3.0.3"
}
},
"node_modules/@redis/bloom": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz",
"integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==",
"license": "MIT",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/@redis/client": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz",
"integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==",
"license": "MIT",
"dependencies": {
"cluster-key-slot": "1.1.2",
"generic-pool": "3.9.0",
"yallist": "4.0.0"
},
"engines": {
"node": ">=14"
}
},
"node_modules/@redis/graph": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz",
"integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==",
"license": "MIT",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/@redis/json": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz",
"integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==",
"license": "MIT",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/@redis/search": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz",
"integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==",
"license": "MIT",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/@redis/time-series": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz",
"integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==",
"license": "MIT",
"peerDependencies": {
"@redis/client": "^1.0.0"
}
},
"node_modules/@types/geojson": {
"version": "7946.0.15",
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz",
@ -98,6 +183,12 @@
"node": ">=16.20.1"
}
},
"node_modules/buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
"license": "BSD-3-Clause"
},
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@ -135,6 +226,15 @@
"node": ">= 0.4"
}
},
"node_modules/cluster-key-slot": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
"integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
"license": "Apache-2.0",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@ -228,6 +328,18 @@
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/dotenv": {
"version": "16.4.7",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
"integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/dunder-proto": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz",
@ -241,6 +353,15 @@
"node": ">= 0.4"
}
},
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
"license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
}
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@ -369,6 +490,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/generic-pool": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
"integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/get-intrinsic": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz",
@ -473,6 +603,97 @@
"node": ">= 0.10"
}
},
"node_modules/jsonwebtoken": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
"integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
"license": "MIT",
"dependencies": {
"jws": "^3.2.2",
"lodash.includes": "^4.3.0",
"lodash.isboolean": "^3.0.3",
"lodash.isinteger": "^4.0.4",
"lodash.isnumber": "^3.0.3",
"lodash.isplainobject": "^4.0.6",
"lodash.isstring": "^4.0.1",
"lodash.once": "^4.0.0",
"ms": "^2.1.1",
"semver": "^7.5.4"
},
"engines": {
"node": ">=12",
"npm": ">=6"
}
},
"node_modules/jsonwebtoken/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
"integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
"license": "MIT",
"dependencies": {
"buffer-equal-constant-time": "1.0.1",
"ecdsa-sig-formatter": "1.0.11",
"safe-buffer": "^5.0.1"
}
},
"node_modules/jws": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
"integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
"license": "MIT",
"dependencies": {
"jwa": "^1.4.1",
"safe-buffer": "^5.0.1"
}
},
"node_modules/lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
"integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
"license": "MIT"
},
"node_modules/lodash.isboolean": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
"integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
"license": "MIT"
},
"node_modules/lodash.isinteger": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
"integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
"license": "MIT"
},
"node_modules/lodash.isnumber": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
"integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
"license": "MIT"
},
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"license": "MIT"
},
"node_modules/lodash.isstring": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
"integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
"license": "MIT"
},
"node_modules/lodash.once": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
"license": "MIT"
},
"node_modules/lru-cache": {
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
@ -729,6 +950,23 @@
"node": ">= 0.8"
}
},
"node_modules/redis": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz",
"integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==",
"license": "MIT",
"workspaces": [
"./packages/*"
],
"dependencies": {
"@redis/bloom": "1.2.0",
"@redis/client": "1.6.0",
"@redis/graph": "1.1.1",
"@redis/json": "1.0.7",
"@redis/search": "1.2.0",
"@redis/time-series": "1.1.0"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@ -753,6 +991,18 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/semver": {
"version": "7.6.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/send": {
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
@ -909,6 +1159,15 @@
"node": ">= 0.4.0"
}
},
"node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@ -936,6 +1195,12 @@
"engines": {
"node": ">=16"
}
},
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"license": "ISC"
}
}
}

View File

@ -10,10 +10,13 @@
"license": "ISC",
"description": "",
"dependencies": {
"@azure/msal-node": "^2.16.2",
"body-parser": "^1.20.3",
"cors": "^2.8.5",
"dotenv": "^16.4.7",
"express": "^4.21.2",
"mariadb": "^3.4.0",
"mongodb": "^6.12.0"
"mongodb": "^6.12.0",
"redis": "^4.7.0"
}
}

View File

@ -3,9 +3,9 @@
</script>
<header class="bg-blue-800 flex flex-row p-4 place-content-between items-center">
<header class="bg-blue-700 flex flex-row p-4 place-content-between items-center">
<a href="/home"><img class="max-w-36 mr-5 ml-4 aspect-auto" src="/branding/mpe_logo.png" alt="MPE Logo"></a>
<a href="/add" class="rounded-3xl bg-blue-600 text-white p-2 px-10 font-roboto shadow m-1 h-10">Add</a>
<a href="/add" class="rounded-3xl bg-blue-500 text-white p-2 px-10 font-roboto shadow m-1 h-10">Add</a>
</header>
<slot />

View File

@ -0,0 +1,46 @@
<!--
This example requires updating your template:
```
<html class="h-full bg-white">
<body class="h-full">
```
-->
<div class="flex min-h-full flex-col justify-center px-6 py-12 lg:px-8">
<div class="sm:mx-auto sm:w-full sm:max-w-sm">
<h2 class="mt-10 text-center text-2xl/9 font-bold tracking-tight text-gray-900">Sign in to your account</h2>
</div>
<div class="mt-4 sm:mx-auto sm:w-full sm:max-w-sm">
<form class="space-y-6" action="#" method="POST">
<div>
<label for="email" class="block text-sm/6 font-medium text-gray-900">Email address</label>
<div class="mt-2">
<input type="email" name="email" id="email" autocomplete="email" required class="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-blue-500 sm:text-sm/6">
</div>
</div>
<div>
<div class="flex items-center justify-between">
<label for="password" class="block text-sm/6 font-medium text-gray-900">Password</label>
<div class="text-sm">
<a href="#" class="font-semibold text-blue-500 hover:text-blue-400">Forgot password?</a>
</div>
</div>
<div class="mt-2">
<input type="password" name="password" id="password" autocomplete="current-password" required class="block w-full rounded-md bg-white px-3 py-1.5 text-base text-gray-900 outline outline-1 -outline-offset-1 outline-gray-300 placeholder:text-gray-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-blue-500 sm:text-sm/6">
</div>
</div>
<div>
<button type="submit" class="flex w-full justify-center rounded-md bg-blue-500 px-3 py-1.5 text-sm/6 font-semibold text-white shadow-sm hover:bg-blue-400 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500">Sign in</button>
</div>
</form>
<p class="mt-10 text-center text-sm/6 text-gray-500">
Not a member?
<a href="#" class="font-semibold text-blue-500 hover:text-blue-400">Sign Up Now</a>
</p>
</div>
</div>