121 lines
2.5 KiB
Go
121 lines
2.5 KiB
Go
package lsxd
|
||
|
||
import (
|
||
"ai_scheduler/internal/config"
|
||
"ai_scheduler/internal/data/constants"
|
||
"ai_scheduler/internal/pkg/l_request"
|
||
"ai_scheduler/utils"
|
||
"context"
|
||
"encoding/json"
|
||
|
||
"github.com/go-kratos/kratos/v2/log"
|
||
"github.com/redis/go-redis/v9"
|
||
)
|
||
|
||
type Login struct {
|
||
config *config.Config
|
||
redisCli *redis.Client
|
||
}
|
||
|
||
func NewLogin(config *config.Config, rdb *utils.Rdb) *Login {
|
||
return &Login{
|
||
config: config,
|
||
redisCli: rdb.Rdb,
|
||
}
|
||
}
|
||
|
||
func (l *Login) GetToken() string {
|
||
ctx := context.Background()
|
||
// 1.取缓存
|
||
token, err := l.redisCli.Get(ctx, constants.CACHE_KEY_LSXD_TOKEN).Result()
|
||
if err != nil {
|
||
log.Errorf("lsxd get token from redis failed, err: %v", err)
|
||
}
|
||
|
||
// 2.缓存存在
|
||
if token != "" {
|
||
// 3.缓存有效直接输出
|
||
if l.checkTokenValid(token) {
|
||
return token
|
||
}
|
||
}
|
||
|
||
// 4.缓存不存在或缓存无效,调用登录接口获取token
|
||
token, err = l.login()
|
||
if err != nil {
|
||
log.Errorf("lsxd login failed, err: %v", err)
|
||
return ""
|
||
}
|
||
// 5.缓存token
|
||
l.redisCli.Set(ctx, constants.CACHE_KEY_LSXD_TOKEN, token, constants.EXPIRE_LSXD_TOKEN)
|
||
|
||
return token
|
||
}
|
||
|
||
// 校验token是否有效
|
||
func (l *Login) checkTokenValid(token string) bool {
|
||
// 欢迎页校验token有效
|
||
checkTokenURL := l.config.LSXD.CheckTokenURL
|
||
// 调用欢迎页校验token有效
|
||
r := l_request.Request{
|
||
Url: checkTokenURL,
|
||
Headers: map[string]string{
|
||
"Content-Type": "application/json",
|
||
"Authorization": token,
|
||
},
|
||
Method: "GET",
|
||
}
|
||
res, err := r.Send()
|
||
if err != nil {
|
||
log.Errorf("lsxd check token valid failed, err: %v", err)
|
||
return false
|
||
}
|
||
if res.StatusCode != 200 {
|
||
log.Errorf("lsxd check token valid failed, status code: %d", res.StatusCode)
|
||
return false
|
||
}
|
||
|
||
log.Info("lsxd check token valid success")
|
||
|
||
return true
|
||
}
|
||
|
||
// 调用登录接口获取token
|
||
func (l *Login) login() (string, error) {
|
||
// 1.获取配置
|
||
loginURL := l.config.LSXD.LoginURL
|
||
phone := l.config.LSXD.Phone
|
||
password := l.config.LSXD.Password
|
||
|
||
// 2.调用登录接口获取token
|
||
r := l_request.Request{
|
||
Url: loginURL,
|
||
Headers: map[string]string{
|
||
"Content-Type": "application/json",
|
||
},
|
||
Method: "POST",
|
||
Json: map[string]any{
|
||
"phone": phone,
|
||
"password": password,
|
||
"code": "123456",
|
||
},
|
||
}
|
||
res, err := r.Send()
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
|
||
// 3.解析token
|
||
var resp struct {
|
||
Token string `json:"accessToken"`
|
||
}
|
||
err = json.Unmarshal(res.Content, &resp)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
token := resp.Token
|
||
|
||
// 4.返回token
|
||
return token, nil
|
||
}
|