Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/febbox/oauth2.go
1987 views
1
package febbox
2
3
import (
4
"context"
5
"encoding/json"
6
"errors"
7
"net/http"
8
"net/url"
9
"strings"
10
"time"
11
12
"golang.org/x/oauth2"
13
"golang.org/x/oauth2/clientcredentials"
14
)
15
16
type customTokenSource struct {
17
config *clientcredentials.Config
18
ctx context.Context
19
refreshToken string
20
}
21
22
func (c *customTokenSource) Token() (*oauth2.Token, error) {
23
v := url.Values{}
24
if c.refreshToken != "" {
25
v.Set("grant_type", "refresh_token")
26
v.Set("refresh_token", c.refreshToken)
27
} else {
28
v.Set("grant_type", "client_credentials")
29
}
30
31
v.Set("client_id", c.config.ClientID)
32
v.Set("client_secret", c.config.ClientSecret)
33
34
req, err := http.NewRequest("POST", c.config.TokenURL, strings.NewReader(v.Encode()))
35
if err != nil {
36
return nil, err
37
}
38
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
39
40
resp, err := http.DefaultClient.Do(req.WithContext(c.ctx))
41
if err != nil {
42
return nil, err
43
}
44
defer resp.Body.Close()
45
46
if resp.StatusCode != http.StatusOK {
47
return nil, errors.New("oauth2: cannot fetch token")
48
}
49
50
var tokenResp struct {
51
Code int `json:"code"`
52
Msg string `json:"msg"`
53
Data struct {
54
AccessToken string `json:"access_token"`
55
ExpiresIn int64 `json:"expires_in"`
56
TokenType string `json:"token_type"`
57
Scope string `json:"scope"`
58
RefreshToken string `json:"refresh_token"`
59
} `json:"data"`
60
}
61
62
if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
63
return nil, err
64
}
65
66
if tokenResp.Code != 1 {
67
return nil, errors.New("oauth2: server response error")
68
}
69
70
c.refreshToken = tokenResp.Data.RefreshToken
71
72
token := &oauth2.Token{
73
AccessToken: tokenResp.Data.AccessToken,
74
TokenType: tokenResp.Data.TokenType,
75
RefreshToken: tokenResp.Data.RefreshToken,
76
Expiry: time.Now().Add(time.Duration(tokenResp.Data.ExpiresIn) * time.Second),
77
}
78
79
return token, nil
80
}
81
82
func (d *FebBox) initializeOAuth2Token(ctx context.Context, oauth2Config *clientcredentials.Config, refreshToken string) {
83
d.oauth2Token = oauth2.ReuseTokenSource(nil, &customTokenSource{
84
config: oauth2Config,
85
ctx: ctx,
86
refreshToken: refreshToken,
87
})
88
}
89
90