У меня есть веб-приложение, встроенное в 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
Любая помощь приветствуется. Спасибо