Создайте и разверните безопасный REST API с помощью Go, Postgresql, JWT и GORM.

Перейти к профилю Adigun Hammed Olalekan

Адигун Хаммед ОлалеканЗаблокированоUnblockFollowFollowing

4 мая

В этом руководстве мы узнаем, как разработать и развернуть безопасный REST API с использованием языка программирования Go.

Зачем идти?

Go — очень интересный язык программирования, это строго типизированный язык, который очень быстро компилируется, его производительность сравнима с C++, в go есть горутины — гораздо более эффективная замена Threads, а также go дает вам свободу для статического типа. в сети — я понимаю, что это не ново, просто мне нравится путь Го.

Что мы строим?

Мы собираемся построить Приложение менеджера контактов/телефонной книги, наш API позволит пользователям добавлять контакты в свои профили, они смогут восстановить их в случае потери телефона.

Предпосылки

В этом уроке предполагалось, что вы уже установили следующие пакеты

  • Идти
  • PostgreSQL
  • GoLand IDE — опционально (я буду использовать его в этом уроке)

Я также предположил, что вы настроили GOPATH. Проверьте это, если вы еще не

Давай сделаем это!

Что такое ОТДЫХ?

ОТДЫХ означает Representational State Transferэто механизм, используемый современными клиентскими приложениями для связи с базами данных и серверами через http —https://en.wikipedia.org/wiki/Representational_state_transfer
Итак, у вас есть новая идея для стартапа или вы хотите создать этот потрясающий побочный проект? Протокол REST в основном подходит.

Создание приложения

Мы начнем с определения зависимостей пакетов, которые нам понадобятся для этого проекта, к счастью для нас, стандартная библиотека Go достаточно богата, чтобы создать полноценный веб-сайт без использования стороннего фреймворка (надеюсь, я прав) — см. net.http package, но для облегчения нашей работы нам понадобятся следующие пакеты:

  • gorilla/mux — Мощный URL-маршрутизатор и диспетчер. Мы используем этот пакет для сопоставления путей URL с их обработчиками.
  • jinzhu/gorm — фантастическая библиотека ORM для Golang, ориентированная на разработчиков. Мы используем этот пакет ORM (Object Relational Mapper) для беспрепятственного взаимодействия с нашей базой данных.
  • dgrijalva/jwt-go — используется для подписи и проверки токенов JWT.
  • joho/godotenv — Используется для загрузки файлов .env в проект.

Чтобы установить любой из этих пакетов, откройте terminal и беги

go get github.com/{package-name}

Эта команда установит пакеты в ваш GOPATH.

Структура проекта


Проверьте левую боковую панель, чтобы увидеть структуру проекта.

utils.go

utils.go содержат удобные функции утилиты для создания json сообщения и вернуть json отклик. Обратите внимание на две функции Message() а также Respond() прежде чем мы продолжим.

Подробнее о JWT

Веб-токены JSON — это открытый отраслевой стандарт. RFC 7519 способ надежного представления требований между двумя сторонами. Пользователей веб-приложений легко идентифицировать с помощью сеансов, однако, когда API вашего веб-приложения взаимодействует, скажем, с клиентом Android или IOS, сеансы становятся непригодными для использования из-за природы HTTP-запроса без сохранения состояния. С помощью JWT мы можем создать уникальный токен для каждого аутентифицированного пользователя, этот токен будет включен в заголовок последующего запроса к серверу API, этот метод позволяет нам идентифицировать всех пользователей, которые совершают вызовы к нашему API. Давайте посмотрим на реализацию ниже

Комментарии внутри кода объясняют все, что нужно знать, но в основном код создает Middleware перехватывать все запросы, проверять наличие токена аутентификации (токена JWT), проверять, является ли он подлинным и действительным, а затем отправлять ошибку обратно клиенту, если мы обнаружим какой-либо недостаток в токене, или перейти к обслуживанию запроса в противном случае (если токен действителен), позже вы увидите, как мы можем получить доступ к пользователю, взаимодействующему с нашим API, из запроса.

Построение системы регистрации и входа пользователей

Мы хотим, чтобы наши пользователи могли зарегистрироваться и войти в систему перед резервным копированием/сохранением своих контактов в нашей системе. Первое, что нам нужно сделать, это подключиться к нашей базе данных, мы используем .env файл для хранения учетных данных нашей базы данных, мой .env выглядит так

db_name = gocontacts
db_pass = **** //This is default to the current user's password on windows for postgresql
db_user = postgres
db_type = postgres
db_host = localhost
db_port = 5434
token_password = thisIsTheJwtSecretPassword //Do not commit to git!

Затем мы можем подключиться к базе данных, используя следующие фрагменты.

Код делает очень простую вещь в файле init() функция — init() автоматически вызывается Go, код извлекает информацию о соединении из .env Затем создайте строку подключения и используйте ее для подключения к базе данных.

Создание точки входа в приложение

На данный момент нам удалось создать промежуточное ПО JWT и подключиться к нашей базе данных. Следующим шагом является создание точки входа приложения, см. фрагмент кода ниже.

Мы создаем новый объект Router — строка 13, мы присоединяем наше промежуточное ПО JWT auth с помощью маршрутизатора. Use() function — строка 14, а затем приступаем к прослушиванию входящих запросов.

Используйте маленькую кнопку воспроизведения мультимедиа, расположенную слева от func main() чтобы скомпилировать и запустить приложение, если все хорошо, вы не должны увидеть ошибку в консоли, в случае, если ошибка была, еще раз взгляните на параметры подключения к базе данных, чтобы убедиться, что они коррелируют.


Полученные результаты. Произошла миграция БД, GORM преобразовал структуру go в таблицы базы данных.

Создание и аутентификация пользователей

создать новый файл models/accounts.go,

Внутри account.go много загадок, давайте немного разберем их.

Первая часть создает две структуры Token а также Account они представляют собой утверждение токена JWT и учетную запись пользователя соответственно. Функция Validate() проверяет данные, отправленные от клиентов и функции Create() создает новую учетную запись и генерирует токен JWT, который будет отправлен обратно клиенту, сделавшему запрос. Функция Login(username, password) аутентифицировать существующего пользователя, а затем сгенерировать токен JWT, если аутентификация прошла успешно.

authController.go

Содержание очень простое. Он содержит handler за /user/new а также /user/login конечные точки.

Добавьте следующий фрагмент в main.go зарегистрировать наши новые маршруты

router.HandleFunc("/api/user/new", controllers.CreateAccount).Methods("POST")

router.HandleFunc("/api/user/login", controllers.Authenticate).Methods("POST")

Приведенный выше код регистрирует оба /user/new а также /user/login конечные точки и передать соответствующие обработчики запросов.

Теперь перекомпилируйте код и посетите localhost:8000/api/user/new используя почтальон, установите тело запроса на application/json как показано ниже


Ответ от /user/new

Если вы попытаетесь позвонить /user/new дважды с одной и той же полезной нагрузкой, вы получите ответ, что электронная почта уже существует, работает в соответствии с нашими инструкциями.

Создание контактов

Часть функциональности нашего приложения позволяет нашим пользователям создавать/хранить контакты. Контакт будет иметь name а также phone , мы определим их как свойства структуры. Следующие фрагменты принадлежат models/contact.go

То же, что и в models/accounts.go мы создаем функцию Validate() для проверки переданных входных данных мы возвращаем сообщение об ошибке, если происходит что-то, чего мы не хотим, тогда мы написали функцию Create() чтобы вставить этот контакт в базу данных.

Осталось только восстановить контакты. Давай сделаем это!

router.HandleFunc("/api/me/contacts", controllers.GetContactsFor).Methods("GET")

Добавьте приведенный выше фрагмент в main.go сообщить маршрутизатору о регистрации /me/contacts
конечная точка. Давайте создадим controllers.GetContactsFor обработчик для обработки запроса API.

контактыController.go

Ниже приведено содержимое contactController.go.

То, что он делает, очень похоже на authController.go's но в основном он захватывает тело json и декодирует его в Contact struct, если произошла ошибка, немедленно вернуть ответ или вставить контакты в базу данных, если все прошло успешно.

Получение контактов, принадлежащих пользователю

Теперь наши пользователи смогли успешно сохранить свои контакты. Что, если они захотят восстановить сохраненный контакт на случай, если их телефон будет утерян? Посещение /me/contacts должен вернуть json структура контактов вызывающего API (текущего пользователя). Проверьте фрагмент кода, чтобы получить более четкое представление.

Обычно получение конечной точки контактов пользователя должно выглядеть так: /user/{userId}/contacts указав userId как параметр пути очень опасен, потому что каждый аутентифицированный пользователь может создать запрос к этому пути, и контакты других пользователей будут возвращены без проблем, это может привести к жестокой атаке со стороны хакеров — я пытаюсь указать на полезность JWT .
Мы можем легко получить id вызывающего API с помощью r.Context().Value("user") помните, мы установили это значение внутриauth.go— Наше промежуточное ПО для аутентификации


Ответ для /me/contacts

Код этого проекта находится на github —

Развертывание

Мы можем легко развернуть наше приложение на героку. Во-первых, скачать godep . godep — менеджер зависимостей для Golang, похожий на npm для узлов.

go get -u github.com/tools/godep
  • Открытым GoLand terminal и беги godep save Это создаст вызов папки Godeps а также vender . Чтобы узнать больше о godep, посетите
  • Создайте аккаунт на heroku.com и скачайте Heroku Cli затем войдите со своими учетными данными
  • Сделав это, запустите heroku create gocontacts Это создаст для вас приложение на панели управления heroku, а также удаленный репозиторий git.
  • выполните следующую команду, чтобы отправить свой код в героку
  • git add .
  • git commit -m "First commit"
  • git push heroku master

Если все прошло хорошо, ваш экран должен выглядеть как мой.

Вуаля! Ваше приложение развернуто. Следующим шагом является настройка удаленной базы данных Postgresql.

бежать heroku addons:create heroku-postgresql:hobby-dev для создания базы данных. Чтобы узнать больше об этом, посетите

Большой! Мы почти закончили, теперь нужно подключиться к нашей удаленной базе данных.

Перейдите на сайт heroku.com и войдите в систему, используя свои учетные данные. Вы должны найти только что созданное приложение на панели инструментов, щелкните по нему. После этого нажмите на настройки, затем нажмите на Reveal Config Vars
Формат URI соединения Postgresql postgres://username:password@host/dbName Существует переменная с именем DATABASE_URL это было автоматически добавлено к вашему .env файл при создании базы данных postgresql (Примечание: Heroku автоматически заменяет ваш локальный .envкогда вы развертываете свое приложение), из этой переменной мы извлечем наш параметр подключения к базе данных.


Я извлек параметр подключения к базе данных из автоматически сгенерированных переменных DATABASE_URL.

Если все прошло хорошо, ваш API уже должен работать!


Как видите, API работает!

Я старался сделать этот урок максимально понятным. Пожалуйста, несите меня за любую ошибку, с которой вы могли столкнуться. Я просто пытаюсь поделиться своими знаниями.

Репо проекта —

Если у вас есть какие-либо вопросы или исправления, я буду рад узнать.

Подпишись на меня в Твиттере — www.twitter.com/L3kanAdigun

Наймите меня (я свободен и активно ищу работу, напишите мне в Твиттере) —www.twitter.com/L3kanAdigun

Вы можете написать мне лично — adigunhammed.lekan@gmail.com

Это действительно длинная статья, спасибо за чтение.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *