-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathauth.go
More file actions
111 lines (85 loc) · 2.75 KB
/
auth.go
File metadata and controls
111 lines (85 loc) · 2.75 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package aliyundrive
import (
"errors"
"github.com/asaskevich/EventBus"
"github.com/jakeslee/aliyundrive/models"
"github.com/jinzhu/copier"
"github.com/sirupsen/logrus"
"math/rand"
"strconv"
)
type Credential struct {
UserId string
Name string
AccessToken string
RefreshToken string
RootFolder string
DefaultDriveId string
eventbus EventBus.Bus
}
const (
eventTokenChange = "token:change"
)
func NewCredential(credential *Credential) *Credential {
c := &Credential{
RootFolder: DefaultRootFileId,
eventbus: EventBus.New(),
}
_ = copier.CopyWithOption(c, credential, copier.Option{
IgnoreEmpty: true,
})
return c
}
func (c *Credential) RegisterChangeEvent(fn func(credential *Credential)) *Credential {
_ = c.eventbus.Subscribe(eventTokenChange, fn)
return c
}
func (d *AliyunDrive) RefreshAllToken() {
for name, credential := range d.Credentials {
_, err := d.RefreshToken(credential)
if err != nil {
logrus.Errorf("error occurred refreshing token %s, error: %s", name, err)
}
}
}
// RefreshToken 刷新 RefreshToken,更新 AccessToken 和 Credential 里的相关信息
func (d *AliyunDrive) RefreshToken(credential *Credential) (*models.RefreshTokenResponse, error) {
refreshTokenRequest := models.NewRefreshTokenRequest()
refreshTokenRequest.RefreshToken = credential.RefreshToken
var token models.RefreshTokenResponse
err := d.send(credential, refreshTokenRequest, &token)
if token.Code != "" {
logrus.Errorf("refresh token error: %s", token.Message)
return &token, errors.New(token.Message)
}
credential.RefreshToken = token.RefreshToken
credential.AccessToken = token.AccessToken
credential.Name = token.NickName
credential.DefaultDriveId = token.DefaultDriveId
credential.eventbus.Publish(eventTokenChange, credential)
_, ok := d.Credentials[token.UserId]
if !ok || credential.UserId != token.UserId {
delete(d.Credentials, credential.UserId)
d.Credentials[token.UserId] = credential
credential.UserId = token.UserId
}
return &token, err
}
// AddCredential 增加新的 Credential,同时刷新 RefreshToken
func (d *AliyunDrive) AddCredential(credential *Credential) (*Credential, error) {
credential.UserId = strconv.Itoa(rand.Intn(100000))
d.Credentials[credential.UserId] = credential
_, err := d.RefreshToken(credential)
return credential, err
}
// GetCredentialFromUserId 通过 UserId 取 Credential
func (d *AliyunDrive) GetCredentialFromUserId(userId string) *Credential {
return d.Credentials[userId]
}
// GetUserInfo get user information
func (d *AliyunDrive) GetUserInfo(credential *Credential) (*models.UserInfo, error) {
userInfoRequest := models.NewUserInfoRequest()
var user models.UserInfo
err := d.send(credential, userInfoRequest, &user)
return &user, err
}