You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
6.8 KiB
168 lines
6.8 KiB
/*
|
|
Ecrire une API en node, tournant sur le port 8088,
|
|
permettant de vérifier qu'un utilisateur est existant dans une
|
|
base de donnée "sécurisée" dans laquelle le mot de passe est
|
|
stocké en MD5.
|
|
Les informations de connexion seront stockées en json.
|
|
|
|
Votre réponse sera sous forme d'un zip.
|
|
Elle contiendra au minimum :
|
|
- un fichier SQL pour la création de la base avec un utilisateur dédié
|
|
- un deuxième fichier SQL pour la création de la table et ajoutant un au moins un utilisateur à la table
|
|
- un fichier README indiquant comment installer votre projet et les routes disponibles
|
|
- un fichier package.json
|
|
- un fichier api.js contenant votre code Node
|
|
*/
|
|
|
|
// testing :
|
|
// https://mariadb.com/kb/en/nodejs-connector/
|
|
|
|
import http from 'http'; // to create server
|
|
import url from 'url'; // to parse url
|
|
import fs from 'fs'; // to load config
|
|
|
|
// https://www.npmjs.com/package/email-validator
|
|
// pour vérifier que le mail est un mail valid :
|
|
import validator from 'email-validator';
|
|
|
|
// pour valider le mot de passe
|
|
import md5 from 'md5';
|
|
|
|
// on ajoute la possibilité de require du json en objet
|
|
import { createRequire } from 'module';
|
|
const require = createRequire(import.meta.url);
|
|
|
|
const BASIC_API_PORT = 8088;
|
|
|
|
var config=null;
|
|
if(fs.existsSync(process.cwd() + '/config.json')){
|
|
config = require(process.cwd() + '/config.json');
|
|
}
|
|
else {
|
|
console.log('no config');
|
|
exit(0);
|
|
}
|
|
|
|
const mariadb = require('mariadb');
|
|
const { exit } = require('process');
|
|
const pool = mariadb.createPool({
|
|
host: config.DB_HOST,
|
|
port: config.DB_PORT,
|
|
user: config.DB_USR,
|
|
password:config.DB_PWD,
|
|
database: config.DB_NAME,
|
|
connectionLimit: 5,
|
|
});
|
|
|
|
//const server = http.createServer(function (req, resp) {
|
|
const app = http.createServer
|
|
(
|
|
async (req, res) =>
|
|
{
|
|
const parsedURL = url.parse(req.url, true);
|
|
let response_json = JSON.stringify({"up":false});
|
|
if(req.method === 'GET' && parsedURL.pathname.startsWith('/up'))
|
|
{
|
|
var cnx = null;
|
|
try
|
|
{
|
|
cnx=await pool.getConnection();
|
|
const tables_res = await cnx.query("SHOW TABLES");
|
|
if(tables_res.length > 0)
|
|
{
|
|
response_json = JSON.stringify({'up':true});
|
|
}
|
|
}
|
|
catch(err)
|
|
{
|
|
console.log(err);
|
|
res.statusCode = 400;
|
|
res.end(response_json);
|
|
if(cnx)
|
|
{
|
|
return cnx.end();
|
|
}
|
|
throw(err);
|
|
}
|
|
finally
|
|
{
|
|
res.statusCode = 200;
|
|
res.end(response_json);
|
|
if(cnx)
|
|
{
|
|
return cnx.end();
|
|
}
|
|
}
|
|
}
|
|
else if(req.method === 'POST' && parsedURL.pathname.startsWith('/check'))
|
|
{
|
|
console.log("checking :");
|
|
let responseString = "";
|
|
req.on('data', function (varposted) {
|
|
responseString += varposted;
|
|
}).on('end', async function () {
|
|
if(responseString.indexOf('?')<0) {
|
|
responseString = '?'+responseString;
|
|
}
|
|
let parsedData = url.parse(responseString, true);
|
|
console.log("ParsedData", parsedData);
|
|
let response_content = {'up':false,'emailtocheck':''};
|
|
if(parsedData.query['email'] && parsedData.query['password']) {
|
|
response_content.emailtocheck = parsedData.query['email'];
|
|
response_content.hashedpassword = md5(parsedData.query['password']);
|
|
if(validator.validate(response_content.emailtocheck))
|
|
{
|
|
cnx=await pool.getConnection();
|
|
//let query="SELECT * FROM users WHERE courriel = '" + response_content.emailtocheck +"'";
|
|
let query="SELECT * FROM users WHERE courriel = ? AND mot_de_passe = ?";
|
|
console.log('query : ',query,' with ? = ', response_content.emailtocheck);
|
|
const email_res = await cnx.query(query, [response_content.emailtocheck, response_content.hashedpassword]);
|
|
if(email_res.length > 0)
|
|
{
|
|
response_content.up=true;
|
|
response_content.emailValid=true;
|
|
}
|
|
else
|
|
{
|
|
response_content.up=true;
|
|
response_content.emailValid=false;
|
|
response_content.error='Not Found';
|
|
response_content.error_code=404;
|
|
}
|
|
res.statusCode = 200;
|
|
res.end(JSON.stringify(response_content));
|
|
if(cnx)
|
|
{
|
|
return cnx.end();
|
|
}
|
|
}
|
|
else {
|
|
response_content.up=true;
|
|
response_content.emailValid=false;
|
|
response_content.error='I\'m a teapot';
|
|
response_content.error_code=418;
|
|
res.statusCode = 200;
|
|
res.end(JSON.stringify(response_content));
|
|
}
|
|
}
|
|
else {
|
|
response_content.up=true;
|
|
response_content.emailValid=false;
|
|
response_content.emailtocheck=parsedData.query['email'];
|
|
response_content.error='Invalid query mail or password do match requirements';
|
|
response_content.error_code=400;
|
|
res.statusCode = 200;
|
|
res.end(JSON.stringify(response_content));
|
|
}
|
|
});
|
|
}
|
|
else
|
|
{
|
|
res.statusCode = 400;
|
|
res.end("API Endpoint Not Supported");
|
|
}
|
|
}
|
|
);
|
|
app.listen(BASIC_API_PORT);
|
|
console.log('mariadb test api started');
|