103news.com
Работа
Март
2022
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
26
27 28 29 30 31

Разработка веб-сервера на Go и веб-клиента к API этогому серверу

0
Сервер регистрации callback

1. Написать HTTP-сервер, сохраняющий получаемые этим сервером HTTP-запросы в базе данных. Реализовать на языке программирования Go/golang
2. Реализовать пакет на Go/golang для клиентского использования этого API сервера из п. 1

Краткое описание работы сервер:

0. Сервер, принимающий запросы по HTTP
1. Разрешаем серверу прием запросов по определенному URL
2. После чего все HTTP-запросы получаемые по этому разрешенному в п.1 URL сохраняются в базе данных
3. После чего получаем от сервера информацию: был ли уже получен запрос по этому разрешенному callback URL
и какой именно это был запрос (вся информация - тело запроса, URL, дата-время, заголовок запроса и пр.)

Требуется подробно логировать работу сервера (вывод лога в стандартные потоки вывода stderr, stdout)

------------------------------------------------------------------------------------------------------

Использовать логирование https://github.com/uber-go/zap
Использовать базу данных https://github.com/etcd-io/bbolt
Для работы с HTTP использовать https://github.com/gin-gonic/gin

Использовать go mod
Использовать go 1.18

Будет использоваться под Linux, то есть должно нормально под Linux компилироваться и запускаться.
Реализовать с помощью обычной программы на Go, способной работать из-под systemd
(это обычная программа на Go, systemd сам делает все необходимое для превращения программы в демона/сервис Linux)

------------------------------------------------------------------------------------------------------

Управление сервером по простому API HTTP/JSON, вызовы защищены подписью проверяемой ключом ed25519

Функции API

1) Разрешить сохранять в БД запрос HTTP, принятый сервером по конкретному URL
2) Отменить п. 1)
3) Очистить все разрешения на URL выданные в п. 1)
4) Узнать был ли к серверу ранее выполнен запрос по определенному URL (получение информации из БД)

Подробная документация по этому API - в личку

Фактически сервер работает с двумя группами URL

/api/v1/API_Управления_Сервером (эти вызовы защищены проверкой подписи ключом ed25519)

/callback/url_разрешенные_для_сохранения_в_БД (эти вызовы сохраняются в БД если в 1) было разрешение для данного конкретного URL).

Сохранятся должна вся информация, получаемая сервером по URL /callback/* - дата-время, URL, тело запроса, заголовки запроса.

Пример проверки подписи ed25519

Как загрузить публичный ключ ed25519 из файла:

import (
"crypto/ed25519"
"encoding/base64"
"errors"

"go.uber.org/zap"
)

func getPublicKeyFromBinary(lg *zap.Logger, data []byte) (ed25519.PublicKey, error) {

l := lg.Named("getKeyFromBinary").With(zap.String("data", string(data)))

decoded, err := base64.StdEncoding.DecodeString(string(data))
if err != nil {
errMsg := "Can not decode key from base64"
l.Error(errMsg, zap.Error(err), zap.String("data", string(data)))
return nil, errors.New(errMsg)
}

publicKey := ed25519.PublicKey(decoded)
if len(publicKey) != ed25519.PublicKeySize {
errMsg := "Unexpected size of ed25519 public key"
l.Error(errMsg, zap.Int("len", len(ed)))
return nil, errors.New(errMsg)
}

return publicKey, nil
}

Как выполнять проверку подписи с помощью ed25519:

import (
"crypto/ed25519"
"encoding/base64"
"io/ioutil"
"net/http"

"github.com/gin-gonic/gin"
"go.uber.org/zap"
)

func verifySignature(message []byte, signature string) bool {

signatureB, err := base64.StdEncoding.DecodeString(signature)
if err != nil {
return false
}

return ed25519.Verify(publicKey, message, signatureB)
}

func GinSignatureVerifyMiddleware(ctx *gin.Context) {

bd, err := ioutil.ReadAll(ctx.Request.Body)
if err != nil {
ctx.AbortWithStatus(http.InternalError)
}

// Невозможно прочитать HTTP body дважды
// Но нам нужно это сделать первый раз для проверки подписи
// И второй раз собственно для анализа тела запроса (параметров API)
// Поэтому после чтения тела HTTP-запроса первый раз
// Необходимо его сохранить со специальным предопределенным
// пакетом Gin ключем

ctx.Set(gin.BodyBytesKey, bd)

h := ctx.GetHeader("Signature")

if !verifySignature(bd, h) {
ctx.AbortWithStatus(http.InternalError)
}
}

Подключить middleware к gin можно так

router:= gin.Default()
api:= router.Group("/api/v1/callback-register", GinSignature)
api.POST("enable-callback-url", handlerName)




Губернаторы России
Москва

Собянин вручил государственные и городские награды заслуженным москвичам





Москва

Компания «Мария» рассказала о новых решениях для девелопмента на конференции Московского Бизнес-клуба


Губернаторы России

103news.net – это самые свежие новости из регионов и со всего мира в прямом эфире 24 часа в сутки 7 дней в неделю на всех языках мира без цензуры и предвзятости редактора. Не новости делают нас, а мы – делаем новости. Наши новости опубликованы живыми людьми в формате онлайн. Вы всегда можете добавить свои новости сиюминутно – здесь и прочитать их тут же и – сейчас в России, в Украине и в мире по темам в режиме 24/7 ежесекундно. А теперь ещё - регионы, Крым, Москва и Россия.

Moscow.media
Москва

Собянин: Строительство флагманского центра ГКБ им. Буянова завершится в декабре



103news.comмеждународная интерактивная информационная сеть (ежеминутные новости с ежедневным интелектуальным архивом). Только у нас — все главные новости дня без политической цензуры. "103 Новости" — абсолютно все точки зрения, трезвая аналитика, цивилизованные споры и обсуждения без взаимных обвинений и оскорблений. Помните, что не у всех точка зрения совпадает с Вашей. Уважайте мнение других, даже если Вы отстаиваете свой взгляд и свою позицию. 103news.com — облегчённая версия старейшего обозревателя новостей 123ru.net.

Мы не навязываем Вам своё видение, мы даём Вам объективный срез событий дня без цензуры и без купюр. Новости, какие они есть — онлайн (с поминутным архивом по всем городам и регионам России, Украины, Белоруссии и Абхазии).

103news.com — живые новости в прямом эфире!

В любую минуту Вы можете добавить свою новость мгновенно — здесь.

Музыкальные новости

Comedy Club

Тина Канделаки предложила Евгению Петросяну стать постоянным резидентом Comedy Club




Спорт в России и мире

Алексей Смирнов – актер, которого, надеюсь, еще не забыли

Мультсериал «Команда МАТЧ» взял награду на XXII Международном фестивале спортивного кино

Прогулочные маршруты и спортивные площадки: Четырём зелёным зонам на юге Москвы подарили новую жизнь

Назначены арбитры на матчи 14-ого тура МИР РПЛ


Арина Соболенко

Теннисистки Соболенко и Рыбакина сыграют в одной группе на Итоговом турнире



Новости Крыма на Sevpoisk.ru


Москва

Нужен гол: спортсмены СК «Вороново» сыграют с «МетонМашСервисом» в 3 туре первенства по мини-футболу



Частные объявления в Вашем городе, в Вашем регионе и в России