×
    
      
  
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: