Skip to content

Commit c23ec97

Browse files
rianliwalli
authored and
walli
committedDec 18, 2024·
完善 access token 刷新逻辑 (merge request !102)
Squash merge branch 'fix_20241218_nil_pointer_of_tk' into 'master' 完善 access token 刷新逻辑
1 parent 07ab80d commit c23ec97

File tree

4 files changed

+24
-8
lines changed

4 files changed

+24
-8
lines changed
 

‎examples/custom-filter/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ const (
2929
)
3030

3131
func main() {
32-
ctx := context.Background()
3332
openapi.RegisterReqFilter("set-trace", ReqFilter)
3433
openapi.RegisterRespFilter("get-trace", RespFilter)
3534
// 加载 appid 和 token
@@ -42,6 +41,8 @@ func main() {
4241
log.Fatalln("parse config failed, err:", err)
4342
}
4443
tokenSource := token.NewQQBotTokenSource(credentials)
44+
ctx, cancel := context.WithCancel(context.Background())
45+
defer cancel() //释放刷新协程
4546
if err = token.StartRefreshAccessToken(ctx, tokenSource); err != nil {
4647
log.Fatalln(err)
4748
}

‎examples/custom-logger/main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ const (
2626
)
2727

2828
func main() {
29-
ctx := context.Background()
30-
3129
// 初始化新的文件 logger,并使用相对路径来作为日志存放位置,设置最小日志界别为 DebugLevel
3230
logger, err := New("./", DebugLevel)
3331
if err != nil {
@@ -45,6 +43,8 @@ func main() {
4543
}
4644

4745
tokenSource := token.NewQQBotTokenSource(credentials)
46+
ctx, cancel := context.WithCancel(context.Background())
47+
defer cancel() //释放刷新协程
4848
if err = token.StartRefreshAccessToken(ctx, tokenSource); err != nil {
4949
log.Fatalln(err)
5050
}

‎examples/receive-and-send/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ const (
2828
var processor Processor
2929

3030
func main() {
31-
ctx := context.Background()
3231
// 加载 appid 和 token
3332
content, err := os.ReadFile("config.yaml")
3433
if err != nil {
@@ -43,6 +42,8 @@ func main() {
4342
}
4443
log.Println("credentials:", credentials)
4544
tokenSource := token.NewQQBotTokenSource(credentials)
45+
ctx, cancel := context.WithCancel(context.Background())
46+
defer cancel() //释放刷新协程
4647
if err = token.StartRefreshAccessToken(ctx, tokenSource); err != nil {
4748
log.Fatalln(err)
4849
}

‎token/token_source.go

+18-4
Original file line numberDiff line numberDiff line change
@@ -179,28 +179,42 @@ func StartRefreshAccessToken(ctx context.Context, tokenSource oauth2.TokenSource
179179
}
180180
log.Debugf("token:%+v ", tk)
181181
go func() {
182+
var consecutiveFailures int
182183
for {
183-
refreshMilliSec := getRefreshMilliSec(tk.ExpiresIn)
184+
var refreshMilliSec int64
185+
//上一轮获取 tk 失败
186+
if tk == nil {
187+
if consecutiveFailures > 10 {
188+
panic("get token failed continuously for more than ten times")
189+
}
190+
consecutiveFailures++
191+
refreshMilliSec = 1000 // 1000ms后重试
192+
} else {
193+
consecutiveFailures = 0
194+
refreshMilliSec = getRefreshMilliSec(tk.ExpiresIn)
195+
}
184196
log.Debugf("refresh after %d milli sec", refreshMilliSec)
185-
ticker := time.NewTicker(time.Duration(refreshMilliSec) * time.Millisecond).C
197+
timer := time.NewTimer(time.Duration(refreshMilliSec) * time.Millisecond)
186198
select {
187-
case <-ticker:
199+
case <-timer.C:
188200
{
189201
log.Debugf("start to refresh access token %s", time.Now().Format(time.StampMilli))
190202
tk, err = tokenSource.Token()
191203
if err != nil {
192204
log.Errorf("refresh access token failed:%s", err)
193205
}
206+
timer.Stop()
194207
}
195208
case <-ctx.Done():
196209
{
197210
log.Warnf("recv ctx:%v exit refresh token", ctx.Err())
211+
timer.Stop()
198212
return
199213
}
200214
}
201215
}
202216
}()
203-
return err
217+
return nil
204218
}
205219

206220
var (

0 commit comments

Comments
 (0)