Сегодняшняя статья будет посвящена разработке программы на 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.

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