Сеансы Golang Gorilla не сохраняются в Windows10

Я пытался войти, выйти из системы, чтобы изменить значение.

Вызов sessionStore.Save() работает с новым session(login).

Но session.Save(r, w), sessions.Save(r, w), store.Save(r, w, session) нет

На виндовс 10 ничего не работает.

Я думаю, что причина в разрешениях Windows.

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/sessions"
)

var (
    // key must be 16, 24 or 32 bytes long (AES-128, AES-192 or AES-256)
    key = []byte("super-secret-key")
    store = sessions.NewCookieStore(key)
)

func login(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Authentication goes here
    // ...

    // Set user as authenticated
    session.Values["authenticated"] = true
    session.Save(r, w)
}

func logout(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "cookie-name")

    // Revoke users authentication
    fmt.Fprintln(w, "session : %B", session.Values["authenticated"])
    session.Values["authenticated"] = false
    fmt.Fprintln(w, "session : %B", session.Values["authenticated"])
    session.Save(r, w)
    //sessions.Save(r, w)
    //store.Save(r, w, session)
}

func main() {
    http.HandleFunc("/secret", secret)
    http.HandleFunc("/login", login)
    http.HandleFunc("/logout", logout)

    http.ListenAndServe(":8080", nil)
}

выход:

> curl -s -I http://localhost:8080/login
HTTP/1.1 200 OK
Set-Cookie: cookie-name=MTU3NTUwODQ2MX...
> curl -s --cookie "cookie-name=MTU3NTUwODQ2MX..." http://localhost:8080/logout
session : true
session : false
> curl -s --cookie "cookie-name=MTU3NTUwODQ2MX..." http://localhost:8080/logout
session : true
session : false
> curl -s --cookie "cookie-name=MTU3NTUwODQ2MX..." http://localhost:8080/logout
session : true
session : false

person joon    schedule 05.12.2019    source источник


Ответы (1)


Здесь несколько проблем:

  • вы пишете тело ответа, используя fmt.Fprintln(w, "session : %B", session.Values["authenticated"]), прежде чем сохранять сеанс в ответ. Я не пробирался по проводу, чтобы убедиться, что мои предположения верны, но это заставит сеанс работать так, как ожидалось.
  • файл cookie не настроен, особенно свойство Path.

Я также использую securecookies для генерации случайного ключа подходящей длины.

package main

import (
    "encoding/gob"
    "fmt"
    "log"
    "net/http"
    "os"
    "time"

    "github.com/gorilla/securecookie"
    "github.com/gorilla/sessions"
)

var (
    // key must be 16, 24 or 32 bytes long (AES-128, AES-192 or AES-256)
    key   = securecookie.GenerateRandomKey(32)
    store = sessions.NewCookieStore(key)
    name  = "cookie-name1"
)

func login(w http.ResponseWriter, r *http.Request) {
    session, err := store.Get(r, name)
    log.Println(err)

    // Set user as authenticated
    fmt.Fprintf(os.Stdout, "session : %#v\n", session.Values)
    session.Values["authenticated"] = true
    session.Values["toto"] = ""
    fmt.Fprintf(os.Stdout, "session : %#v\n", session.Values)
    err = sessions.Save(r, w)
    log.Println(err)
}

func logout(w http.ResponseWriter, r *http.Request) {
    session, err := store.Get(r, name)
    log.Println(err)

    // Revoke users authentication
    fmt.Fprintf(os.Stdout, "session : %#v\n", session.Values)
    session.Values["authenticated"] = false
    session.Values["toto"] = time.Now().Format(time.RFC3339Nano)
    fmt.Fprintf(os.Stdout, "session : %#v\n", session.Values)
    err = sessions.Save(r, w)
    log.Println(err)
}

func main() {
    store.Options = &sessions.Options{
        Domain:   "localhost",
        Path:     "/",
        MaxAge:   86400 * 7,
        HttpOnly: true,
    }

    // http.HandleFunc("/secret", secret)
    http.HandleFunc("/login", login)
    http.HandleFunc("/logout", logout)

    http.ListenAndServe(":8080", nil)
}
person mh-cbon    schedule 05.12.2019