#Error con la condicional de saber si el usuario inicio sesion o no hecho con firebase y astro

13 messages · Page 1 of 1 (latest)

left bobcat
#

Cree un login y register con astro, tengo ya funcional incluso el guardado de las cookies y mas pero todo el problema es que cuando pongo la condicional para permirtir que paginas redirigir al iniciar sesion o si inicio sesion a cual pagina mandar
te dejare los codigos de inicio sesion primero quiero que revises si algo mal antes de mostrarte las condicionales:
create-session.ts:
import { app } from "@/firebase/server";
import { getAuth } from "firebase-admin/auth";
import type { APIRoute } from "astro";
export const POST: APIRoute = async ({ request, cookies }) => {
const auth = getAuth(app);
const idToken = request.headers.get("Authorization")?.split("Bearer ")[1];
if (!idToken) {
return new Response("Token no encontrado", { status: 401 });
}
try {
await auth.verifyIdToken(idToken);
} catch (error) {
return new Response("Token inválido", { status: 401 });
}
const fiveDays = 60 * 60 * 24 * 5 * 1000;
const sessionCookie = await auth.createSessionCookie(idToken, {
expiresIn: fiveDays,
});
cookies.set("__session", sessionCookie, {
path: "/",
});
return new Response(null, { status: 200 });
};

singin.ts:
import { actions } from "astro:actions";
import { isInputError } from "astro:actions";
const form_login = document.querySelector("#login-account-form") as HTMLFormElement;
form_login.addEventListener("submit", async (e) => {
e.preventDefault();
const { error, data } = await actions.loginAccount.safe(new FormData(form_login));
if (error) {
console.error(error);
if (isInputError(error)) {
console.error("Input error:", error);
}
return;
}
const idToken = data.idToken;
const response = await fetch('/api/create-session', {
method: 'POST',
headers: {
'Authorization': Bearer ${idToken}
}});
if (response.ok) {
window.location.href = "/auth/true/dashboard";
} else {
console.error('Error al crear la sesión');
}})

river wagonBOT
#

Hi @left bobcat. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave:

#

Lamentablemente, no puedo proporcionar una respuesta precisa a tu pregunta ya que los códigos que proporcionaste no están incluidos en las fuentes de conocimiento que tengo disponibles. Sin embargo, puedo proporcionarte información basada en las fuentes de conocimiento que tengo.

En Astro, puedes verificar si un usuario está autenticado utilizando Firebase de la siguiente manera:

const auth = getAuth(app);
if (Astro.cookies.has("__session")) {
  const sessionCookie = Astro.cookies.get("__session").value;
  const decodedCookie = await auth.verifySessionCookie(sessionCookie);
  if (decodedCookie) {
    return Astro.redirect("/dashboard");
  }
}

Este código verifica si existe una cookie de sesión. Si existe, decodifica la cookie y redirige al usuario a la página del panel de control. Si la cookie de sesión no existe o no es válida, el usuario no será redirigido.

Además, para manejar el inicio de sesión, puedes usar un endpoint de servidor de Astro como este:

export const GET: APIRoute = async ({ request, cookies, redirect }) => {
  const auth = getAuth(app);
  const idToken = request.headers.get("Authorization")?.split("Bearer ")[1];
  if (!idToken) {
    return new Response("No token found", { status: 401 });
  }
  try {
    await auth.verifyIdToken(idToken);
  } catch (error) {
    return new Response("Invalid token", { status: 401 });
  }
  const fiveDays = 60 * 60 * 24 * 5 * 1000;
  const sessionCookie = await auth.createSessionCookie(idToken, {
    expiresIn: fiveDays,
  });
  cookies.set("__session", sessionCookie, {
    path: "/",
  });
  return redirect("/dashboard");
};

Este código recibe un token de identificación del encabezado de autorización, verifica el token y, si es válido, crea una cookie de sesión y redirige al usuario a la página del panel de control.

#

Por favor, revisa tu código y compáralo con estos ejemplos para ver si hay algo que puedas haber pasado por alto. Si el problema persiste, te recomendaría que busques ayuda en un foro de desarrollo web más general, ya que podrían ser capaces de proporcionarte una ayuda más específica.

Fuente: Astro Documentation (https://docs.astro.build/en/guides/backend/google-firebase/#creating-pages)

Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:

#

@left bobcat kapa.ai is still learning and improving, please let us know how it did by reacting below

left bobcat
#

@river wagon entiendo ahora vamos con algo que si sabes, el problema radica aqui:

const auth = getAuth(app);
if (Astro.cookies.has("__session")) {
const sessionCookie = Astro.cookies.get("__session");
if (!sessionCookie) {
return Astro.redirect("/auth/login");
}
const decodedCookie = await auth.verifySessionCookie(sessionCookie.value);
if (decodedCookie) {
return Astro.redirect("/auth/true/dashboard");
}
}

al poner este pedazo de codigo en la cabecera de mi login en local funciona, pero en vercel cuando ya hace desploy al ingresar a la pagina login no la encuentra y por ese codigo, queria ver una alternativa o si sabes porque subido la pagina a deploy no sirve

river wagonBOT
#

Let me check the knowledge base for you. One moment! :books:

#

El problema que estás experimentando puede deberse a cómo se manejan las cookies en un entorno de producción en comparación con un entorno de desarrollo local. En particular, puede haber problemas con las cookies seguras y el protocolo HTTPS.

Cuando estás en un entorno de producción como Vercel, las cookies deben estar configuradas con la opción secure: true para indicar que deben enviarse solo a través de HTTPS. Esto es para proteger la cookie de ser interceptada y manipulada durante la transmisión.

En tu entorno de desarrollo local, es posible que no estés utilizando HTTPS, por lo que la opción secure no sería necesaria. Sin embargo, cuando despliegas tu aplicación a producción, necesitas asegurarte de que tus cookies estén configuradas correctamente para el entorno de producción.

Aquí hay un ejemplo de cómo podrías configurar tus cookies para que sean seguras en producción:

cookies.set("__session", sessionCookie, {
  path: "/",
  secure: process.env.NODE_ENV === 'production', // set to true in production
});

En este ejemplo, la opción secure se establece en true si el entorno es de producción.

Por favor, revisa tu configuración de cookies y asegúrate de que estén configuradas correctamente para tu entorno de producción.

Si el problema persiste, te recomendaría que busques ayuda en la comunidad de Astro (https://astro.build/chat) o en la documentación de Vercel (https://vercel.com/docs) para obtener una ayuda más específica.

Fuente: Astro Documentation (https://docs.astro.build/en/guides/backend/google-firebase/#creating-pages)

Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:

#

@left bobcat kapa.ai is still learning and improving, please let us know how it did by reacting below

left bobcat
#

@river wagon no funciona mira en vercel me sale asi: Esta página no funcionaelite-two-beige.vercel.app no puede procesar esta solicitud en este momento.
HTTP ERROR 500

y la de logiin:
https://elite-two-beige.vercel.app/auth/login

cambie lo que me dijiste:
cookies.set("__session", sessionCookie, {
path: "/",
secure: process.env.NODE_ENV === 'production', // set to true in production
});

y deje estos asi:
const auth = getAuth(app);
if (Astro.cookies.has("__session")) {
const sessionCookie = Astro.cookies.get("__session");
if (!sessionCookie) {
return Astro.redirect("/auth/login");
}
const decodedCookie = await auth.verifySessionCookie(sessionCookie.value);
if (decodedCookie) {
return Astro.redirect("/auth/true/dashboard");
}
}

y pues sigue dandome error por poner la condicional

river wagonBOT
#

Let me check the knowledge base for you. One moment! :books:

#

El error HTTP 500 indica un error interno del servidor, lo que significa que algo salió mal en el servidor, pero el servidor no puede ser más específico sobre cuál es el problema exacto.

En tu caso, el problema puede estar relacionado con la verificación de la cookie de sesión. Si la verificación falla por alguna razón (por ejemplo, la cookie de sesión no es válida o ha expirado), puede resultar en un error 500.

Aquí hay algunas cosas que podrías intentar:

  1. Asegúrate de que estás manejando correctamente los errores cuando verificas la cookie de sesión. Por ejemplo, podrías intentar envolver la llamada a auth.verifySessionCookie en un bloque try/catch para manejar cualquier error que pueda ocurrir:
try {
  const decodedCookie = await auth.verifySessionCookie(sessionCookie.value);
  if (decodedCookie) {
    return Astro.redirect("/auth/true/dashboard");
  }
} catch (error) {
  console.error('Error verifying session cookie:', error);
  // handle error, e.g. redirect to login page
}
  1. Verifica que la cookie de sesión se esté configurando correctamente en el servidor y que se esté enviando al cliente. Podrías intentar imprimir la cookie de sesión en la consola tanto en el servidor como en el cliente para asegurarte de que se esté configurando y enviando correctamente.

  2. Asegúrate de que tu aplicación en Vercel esté configurada para usar HTTPS. Las cookies seguras requieren HTTPS, y si tu aplicación no está usando HTTPS, las cookies seguras no se enviarán.

Si el problema persiste, te recomendaría que busques ayuda en la comunidad de Astro (https://astro.build/chat) o en la documentación de Vercel (https://vercel.com/docs) para obtener una ayuda más específica.