×
Registro
×
Iniciar sesión
×
Recuperar Contraseña
y el codigo de app script es:
const SPREADSHEET_ID = "1StJHOMGeF7duq7fm3k2aq6vKZxTBQ_1aC6_RGlKJbVE"; // ID de tu Google Sheets
const SHEET_NAME = "Usuarios";
const COLS = {
nombre: 1,
telefono: 2,
correo: 3,
contrasena: 4,
direccion: 5,
barrio: 6,
ciudad: 7,
departamento: 8,
pais: 9,
codigo_postal: 10
};
// Punto de entrada que maneja POST
function doPost(e) {
try {
const ss = SpreadsheetApp.openById(SPREADSHEET_ID);
const sheet = ss.getSheetByName(SHEET_NAME);
const data = e.parameter || {};
const accion = data.accion;
if (!accion) {
return respuestaJSON(false, "No se indicó la acción");
}
if (accion === "registro") {
return registrarUsuario(sheet, data);
} else if (accion === "login") {
return loginUsuario(sheet, data);
} else if (accion === "actualizar") {
return actualizarUsuario(sheet, data);
} else if (accion === "recuperar") {
return recuperarContrasena(sheet, data);
} else {
return respuestaJSON(false, "Acción desconocida");
}
} catch (error) {
return respuestaJSON(false, "Error: " + error.message);
}
}
function hashPassword(password) {
const rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, password);
return rawHash.map(b => ("0" + (b & 0xFF).toString(16)).slice(-2)).join("");
}
// Optimizado: busca solo en la columna correo, luego obtiene la fila completa
function buscarUsuario(sheet, correo) {
const lastRow = sheet.getLastRow();
if (lastRow < 2) return null; // No hay datos
const correos = sheet.getRange(2, COLS.correo, lastRow - 1, 1).getValues();
for (let i = 0; i < correos.length; i++) {
if (correos[i][0].toString().toLowerCase() === correo.toLowerCase()) {
const fila = i + 2;
const datos = sheet.getRange(fila, 1, 1, sheet.getLastColumn()).getValues()[0];
return { fila, datos };
}
}
return null;
}
function registrarUsuario(sheet, data) {
const camposRequeridos = ["nombre", "telefono", "correo", "contrasena", "direccion", "barrio", "ciudad", "departamento", "pais", "codigo_postal"];
for (const campo of camposRequeridos) {
if (!data[campo]) {
return respuestaJSON(false, `Falta el campo obligatorio: ${campo}`);
}
}
if (buscarUsuario(sheet, data.correo)) {
return respuestaJSON(false, "Ya existe un usuario registrado con ese correo");
}
const contrasenaHash = hashPassword(data.contrasena);
const nuevaFila = [
data.nombre,
data.telefono,
data.correo.toLowerCase(),
contrasenaHash,
data.direccion,
data.barrio,
data.ciudad,
data.departamento,
data.pais,
data.codigo_postal
];
sheet.appendRow(nuevaFila);
return respuestaJSON(true, "Registro exitoso");
}
function loginUsuario(sheet, data) {
if (!data.correo || !data.contrasena) {
return respuestaJSON(false, "Correo y contraseña son requeridos");
}
const usuario = buscarUsuario(sheet, data.correo);
if (!usuario) {
return respuestaJSON(false, "Usuario no encontrado");
}
const hashInput = hashPassword(data.contrasena);
if (usuario.datos[COLS.contrasena - 1] !== hashInput) {
return respuestaJSON(false, "Contraseña incorrecta");
}
const datosUsuario = {
nombre: usuario.datos[COLS.nombre - 1],
telefono: usuario.datos[COLS.telefono - 1],
correo: usuario.datos[COLS.correo - 1],
direccion: usuario.datos[COLS.direccion - 1],
barrio: usuario.datos[COLS.barrio - 1],
ciudad: usuario.datos[COLS.ciudad - 1],
departamento: usuario.datos[COLS.departamento - 1],
pais: usuario.datos[COLS.pais - 1],
codigo_postal: usuario.datos[COLS.codigo_postal - 1]
};
return ContentService.createTextOutput(JSON.stringify({
success: true,
message: "Login exitoso",
datos: datosUsuario
})).setMimeType(ContentService.MimeType.JSON);
}
function actualizarUsuario(sheet, data) {
if (!data.correo) {
return respuestaJSON(false, "Correo es obligatorio para actualizar");
}
const usuario = buscarUsuario(sheet, data.correo);
if (!usuario) {
return respuestaJSON(false, "Usuario no encontrado");
}
const fila = usuario.fila;
let contrasenaHash = usuario.datos[COLS.contrasena - 1];
if (data.contrasena && data.contrasena.trim() !== "") {
contrasenaHash = hashPassword(data.contrasena);
}
const nuevosDatos = [
data.nombre || usuario.datos[COLS.nombre - 1],
data.telefono || usuario.datos[COLS.telefono - 1],
usuario.datos[COLS.correo - 1],
contrasenaHash,
data.direccion || usuario.datos[COLS.direccion - 1],
data.barrio || usuario.datos[COLS.barrio - 1],
data.ciudad || usuario.datos[COLS.ciudad - 1],
data.departamento || usuario.datos[COLS.departamento - 1],
data.pais || usuario.datos[COLS.pais - 1],
data.codigo_postal || usuario.datos[COLS.codigo_postal - 1]
];
sheet.getRange(fila, 1, 1, nuevosDatos.length).setValues([nuevosDatos]);
const datosActualizados = {
nombre: nuevosDatos[COLS.nombre - 1],
telefono: nuevosDatos[COLS.telefono - 1],
correo: nuevosDatos[COLS.correo - 1],
direccion: nuevosDatos[COLS.direccion - 1],
barrio: nuevosDatos[COLS.barrio - 1],
ciudad: nuevosDatos[COLS.ciudad - 1],
departamento: nuevosDatos[COLS.departamento - 1],
pais: nuevosDatos[COLS.pais - 1],
codigo_postal: nuevosDatos[COLS.codigo_postal - 1]
};
return respuestaJSON(true, "Perfil actualizado con éxito", datosActualizados);
}
function recuperarContrasena(sheet, data) {
const correo = data.correo;
if (!correo) {
return respuestaJSON(false, "El correo es obligatorio");
}
const usuario = buscarUsuario(sheet, correo);
if (!usuario) {
return respuestaJSON(false, "No existe un usuario con ese correo");
}
// Generar nueva contraseña aleatoria
const nuevaContrasena = Math.random().toString(36).slice(-8); // 8 caracteres
const hashNueva = hashPassword(nuevaContrasena);
// Actualizar la contraseña en la hoja
const fila = usuario.fila;
sheet.getRange(fila, COLS.contrasena).setValue(hashNueva);
const nombreSitio = data.nombre_sitio || "Tu sitio web";
const emailBody = `
Hola ${usuario.datos[COLS.nombre - 1]},
Has solicitado recuperar tu contraseña en "${nombreSitio}".
Tu nueva contraseña temporal es: ${nuevaContrasena}
Por favor, inicia sesión y cambia tu contraseña desde tu perfil.
¡Saludos!
`;
MailApp.sendEmail({
to: correo,
subject: `Recuperación de contraseña - ${nombreSitio}`,
body: emailBody
});
return respuestaJSON(true, "Se ha enviado una nueva contraseña a tu correo.");
}
function respuestaJSON(success, message, datos = null) {
const salida = { success: success, message: message };
if (datos) salida.datos = datos;
return ContentService
.createTextOutput(JSON.stringify(salida))
.setMimeType(ContentService.MimeType.JSON);
}
No hay comentarios: