Este plugin es un fork del plugin original desarrollado por yasudacloud. Está adaptado para la Universidad Nacional y desarrollado por el Lab101. Este plugin permite el inicio de sesión único (SSO) a través de Google y solo permite el acceso a usuarios con la extensión de correo @unal.edu.co.
Para instalar el plugin, debes clonar este repositorio en la carpeta de plugins de tu proyecto Strapi y renombrarlo a webunal-login:
git clone git@github.com:NivekTakedown/strapi-plugin-sso.git ./src/plugins/webunal-loginEn el archivo config/plugins.js de tu proyecto Strapi, agrega la siguiente configuración:
module.exports = ({ env }) => ({
"webunal-login": {
enabled: true,
resolve: "./src/plugins/webunal-login",
config: {
REMEMBER_ME: false,
GOOGLE_OAUTH_CLIENT_ID: "your-google-oauth-client-id",
GOOGLE_OAUTH_CLIENT_SECRET: "your-google-oauth-client-secret",
GOOGLE_OAUTH_REDIRECT_URI: "http://localhost:1337/webunal-login/google/callback",
GOOGLE_ALIAS: "", // Opcional: Alias de Gmail
GOOGLE_GSUITE_HD: "unal.edu.co", // Dominio principal de G Suite
DOMAIN_NAME: "http://localhost:1337",
},
},
// Otros plugins...
});Para implementar la redirección automática al login y proteger las rutas, sigue estos pasos:
- Crea el archivo de middleware en
src/middlewares/auth-check.js:
"use strict";
module.exports = (config, { strapi }) => {
return async (ctx, next) => {
console.log("Middleware auth-check ejecutándose para la ruta:", ctx.path);
// === Manejo de /admin/logout ===
if (ctx.path === "/admin/logout") {
console.log(
"Ruta /admin/logout detectada, eliminando la cookie del token..."
);
// Eliminar la cookie 'token' estableciendo su valor a null y expirando inmediatamente
ctx.cookies.set("token", null, {
httpOnly: true,
secure: process.env.NODE_ENV === "production", // Asegúrate de usar HTTPS en producción
sameSite: "lax",
maxAge: 0, // Expira la cookie inmediatamente
});
console.log(
"Cookie del token eliminada, redirigiendo a /webunal-login/login"
);
// Redirigir al usuario a la página de login después del logout
return ctx.redirect("/webunal-login/login");
}
// === Fin del Manejo de /admin/logout ===
// === Manejo de /admin/auth/login ===
if (ctx.path === "/admin/auth/login") {
console.log(
"Ruta /admin/auth/login detectada, redirigiendo a /webunal-login/login"
);
// Redirigir al usuario a la página de login personalizado
return ctx.redirect("/webunal-login/login");
}
// === Fin del Manejo de /admin/auth/login ===
// === Verificación de Rutas que Comienzan con /admin ===
if (ctx.path.startsWith("/admin")) {
console.log("Ruta /admin detectada, verificando autenticación...");
// Obtener el token JWT desde la cookie
const jwt = ctx.cookies.get("token");
console.log("Token JWT obtenido de la cookie:", jwt);
if (!jwt) {
console.log(
"No se encontró token JWT en la cookie, redirigiendo a /webunal-login/login"
);
return ctx.redirect("/webunal-login/login");
}
try {
// Obtener el servicio de tokens de Strapi Admin
const tokenService = strapi.admin.services.token;
// Decodificar el token JWT
const decodedToken = await tokenService.decodeJwtToken(jwt);
console.log("Token JWT decodificado:", decodedToken);
// Verificar validez del token y existencia del ID
if (
!decodedToken ||
!decodedToken.payload ||
typeof decodedToken.payload.id !== "number"
) {
console.log(
"Token JWT inválido o no contiene un ID de usuario válido, redirigiendo a /webunal-login/login"
);
return ctx.redirect("/webunal-login/login");
}
const userId = decodedToken.payload.id;
// Obtener el usuario asociado al token
const adminUser = await strapi.db.query("admin::user").findOne({
where: { id: userId },
});
if (!adminUser) {
console.log(
"Usuario no encontrado, redirigiendo a /webunal-login/login"
);
return ctx.redirect("/webunal-login/login");
}
// Verificar si el usuario está activo
if (!adminUser.isActive) {
console.log("Usuario inactivo, redirigiendo a /webunal-login/login");
return ctx.redirect("/webunal-login/login");
}
// Establecer el usuario en el contexto de la solicitud
ctx.state.user = adminUser;
console.log("Autenticación exitosa, continuando con la solicitud...");
} catch (error) {
console.error("Error al verificar el token:", error);
return ctx.redirect("/webunal-login/login");
}
} else {
console.log("Ruta no es /admin, continuando con la solicitud...");
}
await next();
};
};- Configura el middleware en
config/middlewares.js:
module.exports = [
"strapi::errors",
"strapi::security",
"strapi::cors",
"strapi::poweredBy",
"strapi::query",
"strapi::body",
"strapi::session",
"strapi::favicon",
"strapi::public",
//, otros middlewares...
{
name: "global::auth-check",
config: {
enabled: true,
},
},
];Asegúrate de definir las siguientes variables de entorno en tu archivo .env:
SITE_NAME=Your Site Name
SITE_SUBTITLE=Your Site Subtitle
LOGIN_INSTRUCTIONS=Please login using your credentials
CONTACT_EMAIL=contact@example.com- Redirección automática del panel de inicio de sesion (
/admin/auth/login) al login - Protección de rutas no públicas
- Verificación de tokens JWT
- Manejo diferenciado de solicitudes API y web
- Configuración flexible de rutas públicas y protegidas
El plugin funcionará automáticamente después de la configuración. Las redirecciones principales son:
http://localhost:1337→http://localhost:1337/webunal-login/loginhttp://localhost:1337/admin→http://localhost:1337/webunal-login/login
Para iniciar sesión manualmente, visita:
http://localhost:1337/webunal-login/google
- NodeJS >=16.0.0 <21.0.0
- Strapi 4.1.7 o superior

