Итак, я писал бэкэнд, используя Go, и пока я тестировал функцию входа в систему / выхода из системы, я заметил, что если я пытаюсь получить доступ к странице с просроченным файлом cookie, мне разрешается это делать. Это происходит только в том случае, если я использую неисправный клиент, потому что если я использую свой браузер, он работает правильно, что, как я предполагаю, означает, что cookie удаляется из веб-браузера, но не из моего бэкэнда.
Я тестировал разные решения, но, похоже, ничего не работает, я заметил следующее: я принял к сведению указатель карты, которая отображает файлы cookie, и заметил, что, несмотря на настройку «authenticated» Значение false, когда неисправный клиент пытается получить доступ к странице, для карты установлено значение true.
это промежуточное ПО, которое обрабатывает страницы, на которых пользователь должен войти в систему, и это должно блокировать вход в систему неисправного клиента, потому что значение «authenticated» из обработчика сеанса должно быть ложным (но это правда, несмотря на то, что установлено ложно до)
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 (несмотря на то, что задано как false прямо перед этим).
это журналы:
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, а затем сразу после истины, несмотря на то, что ничего не происходит в промежутке