Сеансы гориллы работает только иногда - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть веб-приложение, встроенное в Golang, и по каким-то причинам сеансы горилл не сохраняют данные cookie все время, только иногда файлы cookie сохраняются, и даже тогда, когда я набираю новый URL, файл cookie забывается , После того, как я нажму логин примерно 3 раза, cookie сохранится, но несоответствие означает, что что-то не так.

Я пробовал разные конфигурации и структуры init () и перемещался по некоторым методам, чтобы, надеюсь, получить пользователю cookie-файл, даже когда вызывается get-версия обработчика входа в систему. У меня повсюду есть операторы print для распечатки того, что произошло, и поэтому я могу проследить, куда код поступил в «реальном времени».

Обработчик входа в систему

func login(w http.ResponseWriter, r *http.Request) {

    if debug == true {
        fmt.Println("Hit login")
        fmt.Println(r.Method)
    }

    //MAKEING A NEW COOKIE FOR THE USER
    session, err := store.Get(r, appCookie)
    if err != nil {
        fmt.Println("ERROR WITH store.Get", err)
    }
    //PARSE THE LOGIN PAGE
    t, err := template.ParseFiles("auth/login.html")
    if err != nil {
        fmt.Println("Login Handler parsing error", err)
    }
    //A CHECK FOR A POST METHOD THAT MIGHT NOT BE NECESSARY ANYMORE
    if r.Method != http.MethodPost {
        t.Execute(w, nil)
        return
    }

    //READ IN THE PASSWORD ENTERED
    pw := r.FormValue("pwd")
    //PASSWORD ENCRYPTION
    // hash, err := bcrypt.GenerateFromPassword([]byte(pw), bcrypt.MinCost)
    // if err != nil {
    //  log.Println(err)
    // }

    // if debug == true {
    //  fmt.Println(r.FormValue("usr"), string(hash))
    // }

    //ALL OF THE AUTH
    if go_dev.Validate(r.FormValue("usr"), string(pw), db) == true {
        if debug == true {
            fmt.Println("user has been validated")
        }
        //SET THE USER AS LOGGED IN AND PUT THE USERNAME IN THE COOKIE
        session.Values["auth"] = true
        session.Values["usr"] = string(r.FormValue("usr"))

        if debug == true {
            fmt.Println("getUser befor save", session.Values["auth"])
        }

        //SAVE THE COOKIE TO THE USER'S BROWSER
        err := session.Save(r, w)

        //SANITY CHECK TO MAKE SURE THE COOKIE WAS ACTUALLY SAVED
        session, err := store.Get(r, appCookie)
        if err != nil {
            fmt.Println("ERROR WITH store.Get", err)
        }

        if debug == true {
            fmt.Println("getUser after save", session.Values["auth"])
        }

        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        //SEND THEM ALONG TO THEIR USERPAGE
        http.Redirect(w, r, "/view/userpage.html", 302)
    } else {
        if debug == true {
            fmt.Println("user has NOT been validated")
        }

        //EXPLICITLY SET LOGIN STATUS TO FALSE
        session.Values["auth"] = false
        //SAVE THAT COOKIE TO PERSON'S BROWSER
        err := session.Save(r, w)

        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        //JUST RELOAD THE PAGE
        t.Execute(w, nil)
    }

}

Функция проверки подлинности

func heimdall(w http.ResponseWriter, r *http.Request) bool {

    if debug == true {
        fmt.Println("Opening the Bifröst")
    }

    session, _ := store.Get(r, appCookie)

    if debug == true {
        fmt.Println("Bifröst: ", session, session.Values["auth"])
    }

    if session.Values["auth"] != true {
        session.Values["auth"] = false
        err := session.Save(r, w)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            fmt.Println("Error saving cookie")
            return false
        }
        return false
    }
    session.Values["auth"] = true
    return true
}

пример использования heimdall

func ProjectViewHandler(w http.ResponseWriter, r *http.Request) {
    if debug == true {
        fmt.Println("Hit ProjectViewHandler")
    }
    //session, _ := store.Get(r, "cookie-name")

    if heimdall(w, r) != true {
        http.Redirect(w, r, "/login", http.StatusFound)
        return
    }

    pathVariables := mux.Vars(r)

    id, _ := strconv.Atoi(string(pathVariables["key"]))

    p := go_dev.PopulateProjectPage(id, db)

    t, err := template.ParseFiles("/view/project_view.html")

    if err != nil {
        fmt.Println("project page Handler parsing error", err)
    }

    t.Execute(w, p)

}

Помощь в том, чтобы эти адские куки работали последовательно, была бы очень признательна. Полный проект здесь: https://github.com/NikolaasBender/Co-Lab Любая помощь приветствуется. Спасибо

...