Saltar al contenido

Las variables de sesión en golang no se guardan al usar sesiones de gorilla

Ya no necesitas investigar más por otros sitios ya que estás al sitio exacto, tenemos la solución que buscas sin problemas.

Solución:

Por primera vez: nunca, nunca, debe usar md5 para codificar contraseñas. Lea este artículo sobre por qué y luego use el paquete bcrypt de Go. También debe parametrizar sus consultas SQL, de lo contrario, está abierto a catastrófico Ataques de inyección SQL.

De todos modos: hay algunos problemas que debe abordar aquí:

  • Tus sesiones no se “pegan” es que estás configurando el Path como /loginSession – así que cuando un usuario visita cualquier otra ruta (es decir, /), la sesión no es válida para ese ámbito.

Debería configurar un almacén de sesión en la inicialización del programa y configurar las opciones allí:

var store = sessions.NewCookieStore([]byte("something-very-secret"))

func init() {

   store.Options = &sessions.Options
    Domain:   "localhost",
    Path:     "/",
    MaxAge:   3600 * 8, // 8 hours
    HttpOnly: true,

La razón por la que podría establecer una ruta más específica es si los usuarios que iniciaron sesión siempre están dentro de una subruta como /accounts. En tu caso, eso no es lo que está pasando.

Debo agregar que la pestaña “Recursos” de Chrome en el Inspector web (Recursos> Cookies) es increíblemente útil para depurar problemas como estos, ya que puede ver la caducidad de las cookies, la ruta y otras configuraciones.

  • también estás comprobando session.Values["email"] == nil, que no funciona. Un vacío string en Go es solo ""y porqué session.Values es un map[string]interfacedebe escribir afirmar el valor a un string:

es decir

if val, ok := session.Values["email"].(string); ok 
      // if val is a string
      switch val 
             case "":
                 http.Redirect(res, req, "html/login.html", http.StatusFound)
             default:
                 http.Redirect(res, req, "html/home.html", http.StatusFound)
      
     else 
        // if val is not a string type
        http.Redirect(res, req, "html/login.html", http.StatusFound)
    

Nos ocupamos del “no es un string” caso, por lo que somos explícitos sobre lo que debe hacer el programa si la sesión no es como esperábamos (el cliente la modificó o una versión anterior de nuestro programa usó un tipo diferente).

  • No está comprobando errores al guardar sus sesiones.

    sessionNew.Save(req, res)
    

… debiera ser:

    err := sessionNew.Save(req, res)
    if err != nil 
            // handle the error case
    
  • Debe obtener/validar la sesión en SessionHandlerantes de servicio static archivos (sin embargo, lo está haciendo de una manera muy indirecta):

    func SessionHandler(res http.ResponseWriter, req *http.Request) 
        session, err := store.Get(req, "loginSession")
        if err != nil 
            // Handle the error
        
    
        if session.Values["email"] == nil 
            http.Redirect(res, req, "html/login.html", http.StatusFound)
         else 
           http.Redirect(res, req, "html/home.html", http.StatusFound)
        
        // This shouldn't be here - router isn't scoped in this function! You should set this in your main() and wrap it with a function that checks for a valid session.
        router.PathPrefix("/").Handler(http.FileServer(http.Dir("../static/")))
    
    

El problema es que estás escribiendo en la respuesta antes de llamar. session.Save. Eso evita que se escriban los encabezados y, por lo tanto, que su cookie se envíe al cliente.

En el código después session.Query estás llamando Fprintf en la respuesta, tan pronto como se ejecute este código, llamando sessionNew.Save esencialmente no hace nada. Elimina cualquier código que escriba en la respuesta e inténtalo de nuevo.

Supongo que la sesión de Gorilla Toolkit debería devolver un error al llamar a Guardar si ya se ha escrito la respuesta.

Si conservas alguna perplejidad o capacidad de aclarar nuestro reseña eres capaz de realizar una referencia y con gusto lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *