Сегодняшняя статья будет посвящена разработке программы на 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.
Спасибо за чтение статьи, и пишите свои мысли по поводу темы в комментарии.
nazem
Эх, буквально на пару месяцев бы раньше выкатили этот пост.
реализовывал по работе, с кучей нью-ансов и парочкой костылей.
noorsoftprod Автор
А с чем проблемы возникали? Что не получилось, с какими ограничениями пришлось столкнуться?