Ajout de fonction et de vérification

This commit is contained in:
MathieuSevignyLavallee 2024-09-24 22:00:28 -04:00
parent 75ebcff4e0
commit dd6a38854d
4 changed files with 148 additions and 6 deletions

View file

@ -3,6 +3,7 @@
"passportjs": [ "passportjs": [
{ {
"provider1": { "provider1": {
"type": "oauth",
"OAUTH_AUTHORIZATION_URL": "https://www.testurl.com/oauth2/authorize", "OAUTH_AUTHORIZATION_URL": "https://www.testurl.com/oauth2/authorize",
"OAUTH_TOKEN_URL": "https://www.testurl.com/oauth2/token", "OAUTH_TOKEN_URL": "https://www.testurl.com/oauth2/token",
"OAUTH_CLIENT_ID": "your_oauth_client_id", "OAUTH_CLIENT_ID": "your_oauth_client_id",
@ -21,6 +22,28 @@
"OIDC_ISSUER_URL": "https://your-issuer.com", "OIDC_ISSUER_URL": "https://your-issuer.com",
"OIDC_CALLBACK_URL": "http://localhost:3000/auth/oidc/callback" "OIDC_CALLBACK_URL": "http://localhost:3000/auth/oidc/callback"
} }
},
{
"provider3": {
"type": "oauth",
"OAUTH_AUTHORIZATION_URL": "https://www.testurl.com/oauth2/authorize",
"OAUTH_TOKEN_URL": "https://www.testurl.com/oauth2/token",
"OAUTH_CLIENT_ID": "your_oauth_client_id",
"OAUTH_CLIENT_SECRET": "your_oauth_client_secret",
"OAUTH_CALLBACK_URL": "https://localhost:3000/auth/provider/callback",
"OAUTH_ADD_SCOPE": "scopes",
"OAUTH_ROLE_TEACHER_VALUE": "teacher-claim-value",
"OAUTH_ROLE_STUDENT_VALUE": "student-claim-value"
}
},
{
"provider4": {
"type": "oidc",
"OIDC_CLIENT_ID": "your_oidc_client_id",
"OIDC_CLIENT_SECRET": "your_oidc_client_secret",
"OIDC_ISSUER_URL": "https://your-issuer.com",
"OIDC_CALLBACK_URL": "http://localhost:3000/auth/oidc/callback"
}
} }
], ],
"simple-login": { "simple-login": {

View file

@ -10,7 +10,9 @@ services:
restart: always restart: always
backend: backend:
image: fuhrmanator/evaluetonsavoir-backend:latest build:
context: ./server
dockerfile: Dockerfile
container_name: backend container_name: backend
ports: ports:
- "3000:3000" - "3000:3000"

View file

@ -7,6 +7,7 @@ class AuthConfig {
constructor(configPath) { constructor(configPath) {
this.configPath = configPath; this.configPath = configPath;
this.config = this.loadConfig(); this.config = this.loadConfig();
this.validateProvidersConfig();
} }
// Méthode pour lire le fichier de configuration JSON // Méthode pour lire le fichier de configuration JSON
@ -44,10 +45,128 @@ class AuthConfig {
return { error: "Aucune configuration Simple Login disponible." }; return { error: "Aucune configuration Simple Login disponible." };
} }
} }
// Méthode pour retourner tous les providers de type OAuth
getOAuthProviders() {
if (this.config && this.config.auth && this.config.auth.passportjs) {
const oauthProviders = this.config.auth.passportjs.filter(provider => {
const providerName = Object.keys(provider)[0];
return provider[providerName].type === 'oauth';
});
if (oauthProviders.length > 0) {
return oauthProviders;
} else {
return { error: "Aucun fournisseur OAuth disponible." };
}
} else {
return { error: "Aucune configuration PassportJS disponible." };
}
}
// Méthode pour retourner tous les providers de type OIDC
getOIDCProviders() {
if (this.config && this.config.auth && this.config.auth.passportjs) {
const oidcProviders = this.config.auth.passportjs.filter(provider => {
const providerName = Object.keys(provider)[0];
return provider[providerName].type === 'oidc';
});
if (oidcProviders.length > 0) {
return oidcProviders;
} else {
return { error: "Aucun fournisseur OIDC disponible." };
}
} else {
return { error: "Aucune configuration PassportJS disponible." };
}
}
// Méthode pour vérifier si tous les providers ont les variables nécessaires
validateProvidersConfig() {
const requiredOAuthFields = [
'OAUTH_AUTHORIZATION_URL', 'OAUTH_TOKEN_URL', 'OAUTH_CLIENT_ID', 'OAUTH_CLIENT_SECRET', 'OAUTH_CALLBACK_URL'
];
const requiredOIDCFields = [
'OIDC_CLIENT_ID', 'OIDC_CLIENT_SECRET', 'OIDC_ISSUER_URL', 'OIDC_CALLBACK_URL'
];
const missingFieldsReport = [];
if (this.config && this.config.auth && this.config.auth.passportjs) {
this.config.auth.passportjs.forEach(provider => {
const providerName = Object.keys(provider)[0];
const providerConfig = provider[providerName];
let missingFields = [];
// Vérification des providers de type OAuth
if (providerConfig.type === 'oauth') {
missingFields = requiredOAuthFields.filter(field => !(field in providerConfig));
}
// Vérification des providers de type OIDC
else if (providerConfig.type === 'oidc') {
missingFields = requiredOIDCFields.filter(field => !(field in providerConfig));
}
// Si des champs manquent, on les ajoute au rapport
if (missingFields.length > 0) {
missingFieldsReport.push({
provider: providerName,
missingFields: missingFields
});
}
});
// Si des champs manquent, lever une exception
if (missingFieldsReport.length > 0) {
throw new Error(`Configuration invalide pour les providers suivants : ${JSON.stringify(missingFieldsReport, null, 2)}`);
} else {
console.log("Configuration auth_config.json: Tous les providers ont les variables nécessaires.")
return { success: "Tous les providers ont les variables nécessaires." };
}
} else {
throw new Error("Aucune configuration PassportJS disponible.");
}
}
// Méthode pour retourner la configuration des fournisseurs PassportJS pour le frontend
getActiveAuth() {
if (this.config && this.config.auth && this.config.auth.passportjs) {
const passportConfig = {};
this.config.auth.passportjs.forEach(provider => {
const providerName = Object.keys(provider)[0];
const providerConfig = provider[providerName];
// On inclut uniquement les champs nécessaires pour le frontend
passportConfig[providerName] = {};
if (providerConfig.type === 'oauth') {
passportConfig[providerName] = {
type: providerConfig.type,
authorizationUrl: providerConfig.OAUTH_AUTHORIZATION_URL,
callbackUrl: providerConfig.OAUTH_CALLBACK_URL,
};
} else if (providerConfig.type === 'oidc') {
passportConfig[providerName] = {
type: providerConfig.type,
issuerUrl: providerConfig.OIDC_ISSUER_URL,
callbackUrl: providerConfig.OIDC_CALLBACK_URL
};
}
});
return passportConfig;
} else {
return { error: "Aucune configuration PassportJS disponible." };
}
}
} }
// Utilisation de la classe ConfigManager // Utilisation de la classe ConfigManager
const configPath = path.join(__dirname, pathAuthConfig); const configPath = path.join(__dirname, pathAuthConfig);
const instance = new AuthConfig(configPath); const instance = new AuthConfig(configPath);
module.exports = instance; module.exports = instance;

View file

@ -6,12 +6,10 @@ class authController {
try { try {
const passportConfig = authConfig.getPassportJSConfig(); const authActive = authConfig.getActiveAuth();
const simpleLoginConfig = authConfig.getSimpleLoginConfig();
const response = { const response = {
passportConfig, authActive
simpleLoginConfig
}; };
return res.json(response); return res.json(response);