Веб-серверы golang принимают файлы cookie, несмотря на то, что срок их действия истек
Поэтому я писал бэкэнд, используя Go, и пока я тестировал функцию входа в систему / выхода из системы, я заметил, что если я пытаюсь получить доступ к странице с просроченным файлом cookie, мне разрешается это делать. Это происходит только в том случае, если я использую неисправный клиент, потому что если я использую свой браузер, он работает правильно, что, как я предполагаю, означает, что cookie удаляется из веб-браузера, но не из моего бэкэнда.
Я тестировал разные решения, но, похоже, ничего не работает, я заметил следующее: я обратил внимание на указатель карты, которая отображает файлы cookie, и заметил, что, несмотря на установку значения "authenticated" в false когда неисправный клиент пытается получить доступ к странице, для карты устанавливается значение true.
это промежуточное программное обеспечение, которое обрабатывает страницы, на которых пользователь должен войти в систему, и это должно блокировать вход в систему неисправного клиента, потому что значение "authenticated" из обработчика сеанса должно быть ложным (но это правда, несмотря на то, что ранее было установлено значение false)
func (s *server) loggedInOnly(handlerFunc http.HandlerFunc) http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
session, _ := s.store.Get(request, "session-handler")
log.Printf("loggedInOnly: %p %v", &session.Values, session.Values)
if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
http.Error(writer, "Forbidden", http.StatusForbidden)
return
}
handlerFunc(writer, request)
}
}
это функция выхода из системы, которая должна удалять куки (но не удаляет их изнутри)
func (s *server) handleLogout() http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
session, _ := s.store.Get(request, "session-handler")
session.Values["authenticated"] = false
session.Options.MaxAge = -1
session.Save(request, writer)
log.Printf("logout: %p, %v", &session.Values, session.Values)
fmt.Fprint(writer, "Succesfully logged out")
log.Printf("%v was logged out", writer)
}
}
и это функция входа в систему
func (s *server) handleLogin() http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
log.Printf("handle login called")
session, _ := s.store.Get(request, "session-handler")
// can login or not
session.Values["authenticated"] = true
session.Save(request, writer)
Success(writer, "successfully logged in")
}
}
Я должен ожидать, что cookie будет недействительным от моего веб-сервера, поэтому, когда неисправный клиент пытается повторно подключиться, аутентифицированный устанавливается на false, и он не должен иметь возможность доступа к страницам loggedInOnly, вместо этого я могу, потому что для аутентифицированного значения установлено значение true (несмотря на то, что устанавливается в ложь прямо перед).
это журналы:
2019/01/05 17:00:00 loggedInOnly: 0xc0421960b0 map[authenticated:true]
2019/01/05 17:00:00 logout: 0xc0421960b0, map[authenticated:false]
2019/01/05 17:00:01 loggedInOnly: 0xc0420a4560 map[authenticated:true]
2019/01/05 17:00:01 logout: 0xc0420a4560, map[authenticated:false]
как вы можете видеть, для параметра authenticated установлено значение false, а затем сразу после истины, несмотря на то, что между ними ничего не происходит