Небольшая статья для начинающих о том, как создать API аутентификацию с помощью Gо.
Требования
Необходимо установить Go на ваш компьютер.
Приступим к работе
Прежде всего создадим новый проект. Создайте новый файл с именем main.go и введите стартовый код:
package mainimport ( "fmt" "net/http" "github.com/gin-gonic/gin")
Методы POST и GET
Чтобы обрабатывать запросы GET и POST, создадим GetMethod и PostMethod:
func PostMethod(c *gin.Context) { fmt.Println("\napi.go 'PostMethod' called") message := "PostMethod called" c.JSON(http.StatusOK, message)}func GetMethod(c *gin.Context) { fmt.Println("\napi.go 'GetMethod' called") message := "GetMethod called" c.JSON(http.StatusOK, message)}
Основная функция
Необходимо создать роутер Gin для обработки всех запросов:
func main() { router := gin.Default()}
После этого добавим GetMethod и PostMethod:
func main() { router := gin.Default()router.POST("/", PostMethod) router.GET("/", GetMethod)}
И, в завершение всего, добавляем порт, который сервер будет слушать и на котором он будет запускаться:
func main() { router := gin.Default()router.POST("/", PostMethod) router.GET("/", GetMethod)listenPort := "4000"router.Run(":"+listenPort)}
Теперь запустим код, чтобы проверить, работает ли сервер.
Аутентификация
Когда базовый веб-сервер настроен, начнем добавлять элементы для API аутентификации.
Начнем с func main():
func main() { router := gin.Default()subRouterAuthenticated := router.Group("/api/v1/PersonId", gin.BasicAuth(gin.Accounts{ "admin": "adminpass", }))listenPort := "1357"router.Run(":"+listenPort)}
Теперь передайте query-параметры:
func main() { router := gin.Default()subRouterAuthenticated := router.Group("/api/v1/PersonId", gin.BasicAuth(gin.Accounts{ "admin": "adminpass", }))subRouterAuthenticated.GET("/:IdValue", GetMethod)listenPort := "1357" router.Run(":"+listenPort)}
Настройка GetMethod()
GetMethod() запрашивает и выводит Person IdValue из query-параметра, переданного в URL-адресе API:
func GetMethod(c *gin.Context) { fmt.Println("\n'GetMethod' called") IdValue := c.Params.ByName("IdValue") message := "GetMethod Called With Param: " + IdValue c.JSON(http.StatusOK, message)ReqPayload := make([]byte, 1024) ReqPayload, err := c.GetRawData() if err != nil { fmt.Println(err) return } fmt.Println("Request Payload Data: ", string(ReqPayload))}
Полный пример:
package mainimport ( "fmt" "net/http" "github.com/gin-gonic/gin")func GetMethod(c *gin.Context) { fmt.Println("\n'GetMethod' called") IdValue := c.Params.ByName("IdValue") message := "GetMethod Called With Param: " + IdValue c.JSON(http.StatusOK, message)ReqPayload := make([]byte, 1024) ReqPayload, err := c.GetRawData() if err != nil { fmt.Println(err) return } fmt.Println("Request Payload Data: ", string(ReqPayload))}func main() { router := gin.Default()subRouterAuthenticated := router.Group("/api/v1/PersonId", gin.BasicAuth(gin.Accounts{ "admin": "adminpass", }))subRouterAuthenticated.GET("/:IdValue", GetMethod)listenPort := "1357" router.Run(":"+listenPort)}
Тестирование с помощью ngrok
Сначала запустим наше приложение на Go:
go run main.go
1. Скачайте ngrok.
2. Распакуйте исполняемый файл ngrok в папку на сервере.
3. Запустите ngrok на порту 1357 (который вы указали в коде):
./ngrok http 1357
Результат:
ngrok by @emmyc (Ctrl+C to quit)
Session Status online
Session Expires 7 hours, 12 minutes
Version 2.3.35
Region Netherlands (nl)
Web Interface http://127.0.0.1:4040
Forwarding http://ca6d2c4cee3e.ngrok.io ->
http://localhost:4000
Forwarding https://ca6d2c4cee3e.ngrok.io ->
http://localhost:4000
Команда сгенерирует случайный динамический URL-адрес, по которому вы можете протестировать свой API и войти в систему со своими данными для входа, чтобы проверить, все ли работает.
После входа вы увидите:
GetMethod Called With Param: Id456
Всё работает!
Заключение
В этом небольшом руководстве показано, как создать базовый Go API с помощью Gin. Кроме того, мы узнали, как создать приложение для аутентификации и протестировать его с помощью ngrok.
Надеюсь, этих знаний будет достаточно, чтобы создать собственное приложение с аутентификацией на Go.