在Go中使用OAuth和VK API

今天的文章将重点介绍在Go上开发一个程序,该程序使用vk.com API来授权和下载用户数据。

现在,几乎不可能找到不使用OAuth授权的现代服务。有许多使用此协议的方案。让我们尝试编写一个简单的客户端,以便在Go上使用该技术。

首先,您需要在该部分为开发人员创建一个应用程序

指定正确的项目参数很重要,首先您可以指定站点地址-localhost:8080和基本域-localhost。我使用ngrok代理对其进行了测试,因此我在此处输入了从ngrok获得的网址。

vk开发人员面板

此后,仅保留指示重定向URI的位置-将进行重定向的地址以及由于授权而收到的代码。对于该示例,您可以指定localhost:8080 / auth。

图片

VK面板已配置。现在您可以在Go上进行编程了。

所有程序逻辑均可分为3部分:

OAuth客户端设置和html文件连接。

显示带有授权按钮的模板。

授权处理,从VKontakte API收集信息,然后将其传输到模板。

要授权Golang,我选择了标准软件包golang.org/x/oauth2。它易于配置且足够灵活以适合在实际应用程序中使用,并且还包含vk API的链接,软件包的开发人员不会破坏这些链接。

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

此外,访问根目录时,有必要在模板中插入授权链接。

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并获取有关当前用户的信息。我仅获得一些用户API字段,还可以得到许多其他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验证vk

做完了 该应用程序功能不多,但是非常适合作为oauth gin golang或golang vk api实现的工作示例。可以将其添加到任何现有项目中,以在golang上使用VK支持授权功能。

感谢您阅读本文,并在评论中写下您对该主题的看法。

All Articles