Uso de las API de OAuth y VK en Go

El artículo de hoy se centrará en desarrollar un programa en Go que use la API vk.com para autorizar y descargar datos de usuario.

Ahora es casi imposible encontrar un servicio moderno que no use la autorización de OAuth. Hay muchos escenarios para usar este protocolo. Intentemos escribir un cliente simple para trabajar con esta tecnología en Go.

Primero debe crear una aplicación en la sección para desarrolladores .

Es importante especificar los parámetros correctos del proyecto, primero puede especificar la dirección del sitio - localhost : 8080 y el dominio base - localhost. Lo probé usando el proxy ngrok , así que ingresé aquí la url obtenida de ngrok.

panel de desarrollador de vk

Después de esto, solo queda indicar el URI de redireccionamiento: la dirección donde se realizará el redireccionamiento junto con el código recibido como resultado de la autorización. Para la muestra, puede especificar localhost : 8080 / auth.

imagen

El panel VK está configurado. Ahora puede proceder a programar en Go.

Toda la lógica del programa se puede dividir en 3 partes:

configuración del cliente OAuth y conexión de archivos html.

Mostrar una plantilla con un botón para autorización.

Procesamiento de autorización, recopilación de información de la API de VKontakte y transferencia a la plantilla.

Para autorizar Golang, elegí el paquete estándar golang.org/x/oauth2. Es fácil de configurar y lo suficientemente flexible como para ser adecuado para su uso en una aplicación real, y también contiene enlaces a la API vk, que los desarrolladores de paquetes de software no estropean.

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,
}

Además, al acceder a la raíz, es necesario renderizar la plantilla con un enlace de autorización insertado en ella.

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,
  })
})

El último paso es cargar datos de la red social después de la autorización. Para hacer esto, primero debe obtener un token del código de autorización para acceder a la API. Después de eso, recurra a la API de la red social y obtenga información sobre el usuario actual. Solo obtengo algunos de los campos de la API del usuario, puede obtener muchos otros, para esto necesita agregar los necesarios a la estructura 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"`
}

Así es como se ve la ventana de la aplicación después de la autorización.

autenticación de golang vk

Hecho. Esta aplicación no tiene mucha funcionalidad, pero es bastante adecuada como un ejemplo de trabajo de la implementación de oauth gin golang o golang vk api. Se puede agregar a cualquiera de sus proyectos existentes para admitir la funcionalidad de autorización mediante VK en golang.

Gracias por leer el artículo y escribir sus pensamientos sobre el tema en los comentarios.

All Articles