Сегодняшняя статья будет посвящена разработке программы на Go, использующей API vk.com для авторизации и загрузки данных о пользователе.
Сейчас найти современный сервис, который бы не использовал авторизацию по OAuth практически невозможно. Существует большое количество сценариев использования этого протокола. Попробуем же написать простой клиент для работы с этой технологией на Go.
Сначала нужно создать приложение в разделе для разработчиков.
Важно указать правильные параметры проекта, для начала можно указать адрес сайта — localhost:8080 и базовый домен — localhost. Я тестировал его с помощью ngrok proxy, поэтому вводил сюда url, полученный из ngrok.

После этого остается только указать Redirect URI — адрес, куда будет произведен редирект вместе с кодом полученным в результате авторизации. Для пробы можно указать localhost:8080/auth.

Панель ВК настроена. Теперь можно перейти к программированию на Go.
Всю логику программы можно разделить на 3 части:
Настройки OAuth клиента и подключение html файлов.
Отображение шаблона с кнопкой для авторизации.
Обработка авторизации, сбор сведений из API ВКонтакте, передача их в темплейт.
Для авторизации Golang я выбрал стандартный package golang.org/x/oauth2. Он легок в конфигурации и достаточно гибок, чтобы подойти для использования в реальном приложении, а также содержит ссылки на API vk, чем обычно создатели пакетов программистов не балуют.
Далее при обращении к корню необходимо отрендерить template со вставленной в него ссылкой на авторизацию.
Последний шаг — подгрузка данных из социальной сети после авторизации. Для этого сначала нужно получить по авторизационному коду токен для доступа к API. После обратиться к API соцсети и получить информацию о текущем юзере. Я получаю лишь некоторые из полей user API, можно получить и множество других, для этого нужно добавить необходимые в структуру vk.RequestParams.fields.
Так выглядит окно приложения после авторизации.

Сделано. В данном приложении не много функционала, но оно вполне подойдет в качестве рабочего примера реализации oauth gin golang или golang vk api. Его можно добавить в какой-то из ваших существующих проектов для поддержки функционала авторизации с помощью ВК на golang.
Спасибо за чтение статьи, и пишите свои мысли по поводу темы в комментарии.
Сейчас найти современный сервис, который бы не использовал авторизацию по OAuth практически невозможно. Существует большое количество сценариев использования этого протокола. Попробуем же написать простой клиент для работы с этой технологией на Go.
Сначала нужно создать приложение в разделе для разработчиков.
Важно указать правильные параметры проекта, для начала можно указать адрес сайта — localhost:8080 и базовый домен — localhost. Я тестировал его с помощью ngrok proxy, поэтому вводил сюда url, полученный из ngrok.

После этого остается только указать Redirect URI — адрес, куда будет произведен редирект вместе с кодом полученным в результате авторизации. Для пробы можно указать localhost:8080/auth.

Панель ВК настроена. Теперь можно перейти к программированию на Go.
Всю логику программы можно разделить на 3 части:
Настройки OAuth клиента и подключение html файлов.
Отображение шаблона с кнопкой для авторизации.
Обработка авторизации, сбор сведений из API ВКонтакте, передача их в темплейт.
Для авторизации Golang я выбрал стандартный package golang.org/x/oauth2. Он легок в конфигурации и достаточно гибок, чтобы подойти для использования в реальном приложении, а также содержит ссылки на API vk, чем обычно создатели пакетов программистов не балуют.
r := gin.Default() r.LoadHTMLGlob("templates/*") conf := &oauth2.Config{ ClientID: os.Getenv("CLIENT_ID"), ClientSecret: os.Getenv("CLIENT_SECRET"), RedirectURL: os.Getenv("REDIRECT_URL"), Scopes: []string{}, Endpoint: vkAuth.Endpoint, }
Далее при обращении к корню необходимо отрендерить template со вставленной в него ссылкой на авторизацию.
r.GET("/", func(c *gin.Context) { url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline) // получаем URL для редиректа на OAuth API VK и передаем его в темплейт c.HTML(http.StatusOK, "index.html", gin.H{ "authUrl": url, }) })
Последний шаг — подгрузка данных из социальной сети после авторизации. Для этого сначала нужно получить по авторизационному коду токен для доступа к API. После обратиться к API соцсети и получить информацию о текущем юзере. Я получаю лишь некоторые из полей user API, можно получить и множество других, для этого нужно добавить необходимые в структуру vk.RequestParams.fields.
r.GET("/auth", func(c *gin.Context) { ctx := context.Background() // получаем код от API VK из квери стринга authCode := c.Request.URL.Query()["code"] // меняем код на access токен tok, err := conf.Exchange(ctx, authCode[0]) if err != nil { log.Fatal(err) } // создаем клиент для получения данных из API VK client, err := vk.NewClientWithOptions(vk.WithToken(tok.AccessToken)) if err != nil { log.Fatal(err) } user := getCurrentUser(client) c.HTML(http.StatusOK, "auth.html", gin.H{ "user": user, }) }) func getCurrentUser(api *vk.Client) User { var users []User api.CallMethod("users.get", vk.RequestParams{ "fields": "photo_400_orig,city", }, &users) return users[0] } type User struct { ID int64 `json:"id"` FirstName string `json:"first_name"` LastName string `json:"last_name"` Photo string `json:"photo_400_orig"` City City `json:"city"` } type City struct { Title string `json:"title"` }
Так выглядит окно приложения после авторизации.

Сделано. В данном приложении не много функционала, но оно вполне подойдет в качестве рабочего примера реализации oauth gin golang или golang vk api. Его можно добавить в какой-то из ваших существующих проектов для поддержки функционала авторизации с помощью ВК на golang.
Спасибо за чтение статьи, и пишите свои мысли по поводу темы в комментарии.
