Использование OAuth и API VK в Go

от автора

Сегодняшняя статья будет посвящена разработке программы на Go, использующей API vk.com для авторизации и загрузки данных о пользователе.

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

Сначала нужно создать приложение в разделе для разработчиков.

Важно указать правильные параметры проекта, для начала можно указать адрес сайта — localhost:8080 и базовый домен — localhost. Я тестировал его с помощью ngrok proxy, поэтому вводил сюда url, полученный из ngrok.

vk панель разработчика

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

image

Панель ВК настроена. Теперь можно перейти к программированию на 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"` }

Так выглядит окно приложения после авторизации.

golang authentication vk

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

Спасибо за чтение статьи, и пишите свои мысли по поводу темы в комментарии.

ссылка на оригинал статьи https://habr.com/ru/post/499310/


Комментарии

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

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