reprogl

Форк
0
90 строк · 1.9 Кб
1
package oauth
2

3
import (
4
	"encoding/base64"
5
	"encoding/json"
6
	"errors"
7
	"net/http"
8
	"net/url"
9
	"strings"
10

11
	"golang.org/x/oauth2"
12
	"xelbot.com/reprogl/container"
13
)
14

15
var vkEndpoint = oauth2.Endpoint{
16
	AuthURL:  "https://id.vk.com/authorize",
17
	TokenURL: "https://id.vk.com/oauth2/auth",
18
}
19

20
type vkResourceOwner struct {
21
	accessToken string
22
}
23

24
type vkUserInfoResponse struct {
25
	User vkUser `json:"user"`
26
}
27

28
type vkUser struct {
29
	ID        string `json:"user_id"`
30
	FirstName string `json:"first_name,omitempty"`
31
	LastName  string `json:"last_name,omitempty"`
32
	Gender    int    `json:"sex,omitempty"`
33
	Email     string `json:"email,omitempty"`
34
	Avatar    string `json:"avatar,omitempty"`
35
}
36

37
func (vkro *vkResourceOwner) GetUserData() (*UserData, error) {
38
	data := url.Values{}
39
	data.Set("access_token", vkro.accessToken)
40
	data.Set("client_id", container.GetConfig().OAuthVkID)
41

42
	request, err := http.NewRequest(
43
		http.MethodPost,
44
		"https://id.vk.com/oauth2/user_info",
45
		strings.NewReader(data.Encode()))
46
	if err != nil {
47
		return nil, err
48
	}
49

50
	request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
51
	request.Header.Set("Accept", "application/json")
52

53
	buf, err := doRequest(request)
54
	if err != nil {
55
		return nil, err
56
	}
57

58
	if !json.Valid(buf) {
59
		return nil, errors.New("invalid JSON string")
60
	}
61

62
	result := vkUserInfoResponse{}
63
	err = json.Unmarshal(buf, &result)
64
	if err != nil {
65
		return nil, err
66
	}
67

68
	var vkGender Gender
69
	switch result.User.Gender {
70
	case 1:
71
		vkGender = Female
72
	case 2:
73
		vkGender = Male
74
	default:
75
		vkGender = Unknown
76
	}
77

78
	userData := &UserData{
79
		ID:          result.User.ID,
80
		DisplayName: strings.TrimSpace(result.User.FirstName + " " + result.User.LastName),
81
		FirstName:   result.User.FirstName,
82
		Gender:      vkGender,
83
		Email:       result.User.Email,
84
		Avatar:      result.User.Avatar,
85
		RawData:     base64.URLEncoding.EncodeToString(buf),
86
		Provider:    vkProvider,
87
	}
88

89
	return userData, nil
90
}
91

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.