-
Notifications
You must be signed in to change notification settings - Fork 0
/
user.go
85 lines (70 loc) · 2.2 KB
/
user.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package oauth2
import (
"errors"
"github.com/go-zoox/fetch"
"github.com/go-zoox/logger"
"github.com/tidwall/gjson"
)
// User is the oauth2 user.
type User struct {
ID string `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
Avatar string `json:"avatar"`
Nickname string `json:"nickname"`
Groups []string `json:"groups"`
Permissions []string `json:"permissions"`
raw *fetch.Response
}
// Raw gets raw data with *fetch.Response.
func (u *User) Raw() *fetch.Response {
return u.raw
}
// GetUser gets the user by token.
func GetUser(config *Config, token *Token, code string) (*User, error) {
user := &User{}
var response *fetch.Response
var err error
if config.GetUserResponse != nil {
response, err = config.GetUserResponse(config, token, code)
} else {
response, err = fetch.Get(config.UserInfoURL, &fetch.Config{
Headers: map[string]string{
"Authorization": "Bearer " + token.AccessToken,
},
})
}
if err != nil {
return nil, errors.New("get user info error: " + err.Error())
}
logger.Debugf("[oauth2][user]: %s", response.String())
errorCode := response.Get("code").Int()
errorMessage := response.Get("message").String()
if errorCode != 0 {
return nil, errors.New("get user info error(4): " + errorMessage)
}
user.ID = response.Get(config.IDAttributeName).String()
user.Username = response.Get(config.UsernameAttributeName).String()
user.Email = response.Get(config.EmailAttributeName).String()
user.Nickname = response.Get(config.NicknameAttributeName).String()
user.Avatar = response.Get(config.AvatarAttributeName).String()
user.Permissions = make([]string, 0)
if user.Username == "" {
user.Username = user.Email
}
if user.Username == "" {
user.Username = user.ID
}
permissionsResult := response.Get(config.PermissionsAttributeName)
permissionsResult.ForEach(func(key, value gjson.Result) bool {
user.Permissions = append(user.Permissions, value.String())
return true
})
groupsResult := response.Get(config.GroupsAttributeName)
groupsResult.ForEach(func(key, value gjson.Result) bool {
user.Groups = append(user.Groups, value.String())
return true
})
user.raw = response
return user, nil
}