-
Notifications
You must be signed in to change notification settings - Fork 3
/
access_token.go
102 lines (90 loc) · 2.42 KB
/
access_token.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package ocrKit
import (
"fmt"
"github.com/richelieu-yang/chimera/v3/src/component/web/request/httpClientKit"
"github.com/richelieu-yang/chimera/v3/src/core/errorKit"
"github.com/richelieu-yang/chimera/v3/src/core/strKit"
"github.com/richelieu-yang/chimera/v3/src/serialize/json/jsonKit"
"sync"
"time"
)
var (
// clientId 即 apiKey
clientId = ""
// clientSecret 即 secretKey
clientSecret = ""
)
var lock = new(sync.Mutex)
var token *accessToken = nil
func SetApiKeyAndSecretKey(apiKey, secretKey string) error {
lock.Lock()
defer lock.Unlock()
apiKey = strKit.TrimSpace(apiKey)
secretKey = strKit.TrimSpace(secretKey)
if strKit.IsEmpty(apiKey) {
return errorKit.Newf("apiKey is empty")
}
if strKit.IsEmpty(secretKey) {
return errorKit.Newf("secretKey is empty")
}
token = nil
clientId = apiKey
clientSecret = secretKey
return nil
}
func getAccessToken() (*accessToken, error) {
lock.Lock()
defer lock.Unlock()
// (1) token存在
if token != nil {
if !token.isExpired() {
return token, nil
}
// 去除已过期的token
token = nil
}
// (2) token存在,重新生成
var err error
token, err = newAccessToken()
if err != nil {
return nil, err
}
return token, nil
}
// newAccessToken 向百度获取 Access Token
/*
参考: https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu
@return 必定一个为nil,一个非nil
*/
func newAccessToken() (*accessToken, error) {
if strKit.HasEmpty(clientId, clientSecret) {
return nil, errorKit.Newf("SetApiKeyAndSecretKey() should be invoked firstly")
}
url := fmt.Sprintf("https://aip.baidubce.com/oauth/2.0/token?grant_type=%s&client_id=%s&client_secret=%s",
grantType,
clientId,
clientSecret)
_, respData, err := httpClientKit.Get(url)
if err != nil {
return nil, err
}
m := make(map[string]interface{})
if err := jsonKit.Unmarshal(respData, &m); err != nil {
return nil, err
}
token, err := parseMapToAccessToken(m)
if err != nil {
return nil, err
}
if token == nil {
return nil, errorKit.Newf("failure response(%s)", string(respData))
}
// 对token进行简单验证
// 正常情况下,token的有效期为30天,此处判断是为了防止特殊情况(86400秒 == 1天)
if token.ExpiresIn <= 86400 {
return nil, errorKit.Newf("token.ExpiresIn(%d) is invalid", 86400)
}
// 提前1h(3600s)认为token失效,以防特殊情况
token.ExpireTime = time.Now().Add(time.Second * time.Duration(token.ExpiresIn-3600))
return token, nil
}