今天的文章将重点介绍在Go上开发一个程序,该程序使用vk.com API来授权和下载用户数据。现在,几乎不可能找到不使用OAuth授权的现代服务。有许多使用此协议的方案。让我们尝试编写一个简单的客户端,以便在Go上使用该技术。首先,您需要在该部分为开发人员创建一个应用程序。指定正确的项目参数很重要,首先您可以指定站点地址-localhost:8080和基本域-localhost。我使用ngrok代理对其进行了测试,因此我在此处输入了从ngrok获得的网址。
此后,仅保留指示重定向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)
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()
authCode := c.Request.URL.Query()["code"]
tok, err := conf.Exchange(ctx, authCode[0])
if err != nil {
log.Fatal(err)
}
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上使用VK支持授权功能。感谢您阅读本文,并在评论中写下您对该主题的看法。