Напишите веб-сервер с использованием базовой HTTP-авторизации на пути /answer/.
Сервер должен проверять наличие и корректность заголовка Authorization и возвращать ответ The answer is 42 при успешной авторизации.
При запросе без заголовка Authorization сервер должен вернуть статус 403 StatusForbidden и запросить авторизацию.
При запросе с заголовком Authorization, но некорректными данными для аутентификации сервер должен вернуть статус 401 StatusUnauthorized и запросить авторизацию.
Используйте необходимые пакеты и функции для реализации данного функционала.
Middleware функцию назовите Authorization(http.HandlerFunc)
go
package main
import (
"encoding/base64"
"fmt"
"net/http"
"strings"
)
func main() {
// Установка обработчика
http.HandleFunc("/answer/", Authorization(AnswerHandler))
// Запуск веб-сервера на порту 8080
if err := http.ListenAndServe(":8080", nil); err != nil {
panic(err)
}
}
// Middleware для базовой HTTP-авторизации
func Authorization(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// Проверка наличия заголовка Authorization
authHeader := r.Header.Get("Authorization")
if authHeader == "" {
http.Error(w, "Authorization required", http.StatusForbidden)
return
}
// Парсинг заголовка Authorization
auth := strings.SplitN(authHeader, " ", 2)
if len(auth) != 2 || auth[0] != "Basic" {
http.Error(w, "Invalid authorization", http.StatusUnauthorized)
return
}
// Декодирование данных аутентификации
data, err := base64.StdEncoding.DecodeString(auth[1])
if err != nil {
http.Error(w, "Invalid authorization", http.StatusUnauthorized)
return
}
// Проверка данных аутентификации
if string(data) != "username:password" {
http.Error(w, "Invalid username or password", http.StatusUnauthorized)
return
}
// Вызов следующего обработчика
next.ServeHTTP(w, r)
}
}
// Обработчик для пути /answer/
func AnswerHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "The answer is 42")
}
В этом примере функция `main` устанавливает обработчик для пути `/answer/` с использованием функции `Authorization` в качестве Middleware. Затем она запускает веб-сервер на порту 8080.
Функция `Authorization` проверяет наличие и корректность заголовка `Authorization` в запросе. Если заголовок отсутствует или некорректен, то функция возвращает соответствующий статус ошибки. Если аутентификация проходит успешно, то функция вызывает следующий обработчик с помощью метода `ServeHTTP`.
Чтобы запустить сервер, необходимо выполнить компиляцию программы и запустить получившийся исполняемый файл:
shell
go build server.go
./server
После запуска сервер будет доступен по адресу http://localhost:8080/answer/. При запросе на этот адрес без заголовка `Authorization` будет возвращен статус 403 StatusForbidden и текст "Authorization required". При запросе с некорректными данными аутентификации будет возвращен статус 401 StatusUnauthorized и текст "Invalid username or password". При успешной авторизации будет возвращен статус 200 OK и текст "The answer is 42".Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет