optimize login routine logic

This commit is contained in:
tickstep
2025-08-07 17:43:14 +08:00
parent 9b276f2caf
commit 8913597716
6 changed files with 42 additions and 38 deletions
+1
View File
@@ -70,6 +70,7 @@ func CmdLs() cli.Command {
`,
Category: "阿里云盘",
Before: ReloadConfigFunc,
After: SaveConfigFunc,
Action: func(c *cli.Context) error {
if config.Config.ActiveUser() == nil {
fmt.Println("未登录账号")
+4 -1
View File
@@ -308,6 +308,9 @@ func RefreshOpenTokenInNeed(activeUser *config.PanUser) *panlogin.CommonResultEr
// AutomaticallyRefreshTokenTask 自动刷新Token的后台任务
func AutomaticallyRefreshTokenTask() {
go func() {
// 延迟启动自动刷新Token任务,因为主程序启动的时候默认会进行Token的初始化和刷新,避免无效的并行初始化Token
time.Sleep(time.Duration(15) * time.Minute)
// 检测延迟时间(分钟)
delayMinuteTime := time.Duration(1) * time.Minute
//delayMinuteTime := time.Duration(10) * time.Second // for test
@@ -329,7 +332,7 @@ func AutomaticallyRefreshTokenTask() {
attempt = 1
delayMinuteTime = time.Duration(1) * time.Minute
// 刷新Web端Token
// 刷新Webapi端Token
RefreshWebTokenInNeed(activeUser)
// 保存新token到配置文件
-2
View File
@@ -43,8 +43,6 @@ func CmdLocalCd() cli.Command {
切换根目录:
aliyunpan lcd /
`,
Before: command.ReloadConfigFunc,
After: command.SaveConfigFunc,
Action: func(c *cli.Context) error {
if c.NArg() == 0 {
cli.ShowCommandHelp(c, c.Command.Name)
-2
View File
@@ -18,7 +18,6 @@ import (
"github.com/olekukonko/tablewriter"
"github.com/tickstep/aliyunpan-api/aliyunpan"
"github.com/tickstep/aliyunpan/cmder/cmdtable"
"github.com/tickstep/aliyunpan/internal/command"
"github.com/tickstep/library-go/converter"
"github.com/urfave/cli"
"log"
@@ -47,7 +46,6 @@ func CmdLocalLs() cli.Command {
详细列出 我的资源 内的文件和目录
aliyunpan lls /我的资源
`,
Before: command.ReloadConfigFunc,
Action: func(c *cli.Context) error {
var (
orderBy aliyunpan.FileOrderBy = aliyunpan.FileOrderByUpdatedAt
+13 -5
View File
@@ -152,16 +152,23 @@ doOpenLoginAct:
AccessToken: openapiToken.AccessToken,
ExpiredAt: openapiToken.Expired,
}, nil)
openPanClient.SetAccessTokenRefreshCallback(func(userId string, newToken openapi.ApiToken) error {
// api层自动刷新Token,回调通知程序
logger.Verboseln("openapi token refresh, use new token")
openapiToken.AccessToken = newToken.AccessToken
openapiToken.Expired = newToken.ExpiredAt
return nil
})
// open api token maybe expired
// check & refresh new one
openUserInfo, err := openPanClient.GetUserInfo()
if err != nil {
if err.Code == apierror.ApiCodeTokenExpiredCode && tryRefreshOpenToken {
if err.Code == apierror.ApiCodeTokenExpiredCode && tryRefreshOpenToken { // 如果是token过期,则尝试刷新
tryRefreshOpenToken = false
wt, e := loginHelper.GetOpenapiNewToken(ticketId, userId, openapiToken.AccessToken)
if e != nil {
logger.Verboseln("get openapi token from server error: ", e.Msg)
wt, re := loginHelper.GetOpenapiNewToken(ticketId, userId, openapiToken.AccessToken)
if re != nil {
logger.Verboseln("get openapi token from server error: ", re.Msg)
return nil, apierror.NewFailedApiError("get new openapi token error, try login again")
}
if wt != nil {
@@ -170,7 +177,7 @@ doOpenLoginAct:
Expired: wt.Expired,
}
// 检查token有效期
// TODO: 检查token有效期
}
// 回到token检测流程,必须确保token是有效
@@ -250,6 +257,7 @@ doWebLoginAct:
WorkdirFileEntity: *aliyunpan.NewFileEntityForRootDir(),
}
u.PanClient().OpenapiPanClient().SetAccessTokenRefreshCallback(func(userId string, newToken openapi.ApiToken) error {
// api层自动刷新Token,回调通知程序
logger.Verboseln("openapi token refresh, update for user")
u.OpenapiToken = &PanClientToken{
AccessToken: newToken.AccessToken,