Попытка отличить плохую ошибку в пользовательском cookie от внутренней ошибки, используя gorilla/sessions
например,
import "github.com/gorilla/sessions"
sess, err := store.Get(r, sessName)
if err != nil {
// either user error (bad-cookie i.e. invalid HMAC)
// http.Error(w, "not authenticated", http.StatusUnauthorized)
// or server error (FileSystemStore i/o)
// http.Error(w, "internal error", http.StatusInternalServerError)
return
}
В базовом пакете securecookie
есть экспортированная ошибка ErrMacInvalid
для плохих пользовательских файлов cookie.Поэтому обычно нужно просто проверить эту конкретную ошибку, но это не работает:
import "github.com/gorilla/securecookie"
if err == securecookie.ErrMacInvalid {
// bad user-cookie
} else if err != nil {
// otherwise internal error
}
Причина, по которой он не работает - используя скажем securecookie.NewCookieStore()
в качестве хранилища сеансов -он вернет ошибку типа securecookie.MultiError (тип []error
) со значением securecookie.ErrMacInvalid
, указанным в срезе ошибки.
Попытка чего-то подобного выглядит очень запутанной:
if e2, ok := err.(securecookie.MultiError); ok && len(e2) > 0 && e2[0] == securecookie.ErrMacInvalid { {
// bad user-cookie
} else if err != nil {
// otherwise internal error
}
Есть ли более простой способ?