Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/123_open/token.go
1986 views
1
package _123Open
2
3
import (
4
"bytes"
5
"encoding/json"
6
"fmt"
7
"net/http"
8
"sync"
9
"time"
10
)
11
12
const tokenURL = ApiBaseURL + ApiToken
13
14
type tokenManager struct {
15
clientID string
16
clientSecret string
17
18
mu sync.Mutex
19
accessToken string
20
expireTime time.Time
21
}
22
23
func newTokenManager(clientID, clientSecret string) *tokenManager {
24
return &tokenManager{
25
clientID: clientID,
26
clientSecret: clientSecret,
27
}
28
}
29
30
func (tm *tokenManager) getToken() (string, error) {
31
tm.mu.Lock()
32
defer tm.mu.Unlock()
33
34
if tm.accessToken != "" && time.Now().Before(tm.expireTime.Add(-5*time.Minute)) {
35
return tm.accessToken, nil
36
}
37
38
reqBody := map[string]string{
39
"clientID": tm.clientID,
40
"clientSecret": tm.clientSecret,
41
}
42
body, _ := json.Marshal(reqBody)
43
req, err := http.NewRequest("POST", tokenURL, bytes.NewBuffer(body))
44
if err != nil {
45
return "", err
46
}
47
req.Header.Set("Platform", "open_platform")
48
req.Header.Set("Content-Type", "application/json")
49
50
resp, err := http.DefaultClient.Do(req)
51
if err != nil {
52
return "", err
53
}
54
defer resp.Body.Close()
55
56
var result TokenResp
57
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
58
return "", err
59
}
60
61
if result.Code != 0 {
62
return "", fmt.Errorf("get token failed: %s", result.Message)
63
}
64
65
tm.accessToken = result.Data.AccessToken
66
expireAt, err := time.Parse(time.RFC3339, result.Data.ExpiredAt)
67
if err != nil {
68
return "", fmt.Errorf("parse expire time failed: %w", err)
69
}
70
tm.expireTime = expireAt
71
72
return tm.accessToken, nil
73
}
74
75
func (tm *tokenManager) buildHeaders() (http.Header, error) {
76
token, err := tm.getToken()
77
if err != nil {
78
return nil, err
79
}
80
header := http.Header{}
81
header.Set("Authorization", "Bearer "+token)
82
header.Set("Platform", "open_platform")
83
header.Set("Content-Type", "application/json")
84
return header, nil
85
}
86
87