修复密钥同步问题

This commit is contained in:
junleea 2025-08-02 15:39:32 +08:00
parent 68e0ee27f2
commit e1e7e53590
3 changed files with 47 additions and 20 deletions

31
main.go
View File

@ -20,6 +20,12 @@ import (
)
func main() {
// 输入参数
if len(os.Args) > 1 {
initConfig(os.Args[1]) //第一个参数是配置文件路径
} else {
initConfig("") //没有输入参数,则使用默认配置文件路径
}
gin.SetMode(gin.ReleaseMode)
r := gin.Default()
err := dao.Init()
@ -68,6 +74,31 @@ func init() {
panic("failed to read config file:" + err.Error())
}
}
func initConfig(configPath string) {
if proto.Config.TOKEN_SECRET != "" {
return
}
// 创建cid的目录
os.MkdirAll(proto.CID_BASE_DIR, os.ModePerm)
os.MkdirAll(proto.CID_BASE_DIR+"script", os.ModePerm)
os.MkdirAll(proto.CID_BASE_DIR+"workspace", os.ModePerm)
//系统是linux、macos还是windows
if configPath == "" {
if os.Getenv("OS") == "Windows_NT" {
configPath = "C:/Users/Administrator/vp.conf"
} else if os.Getenv("OS") == "linux" {
//文件地址/home/saw-ai/saw-ai.conf
configPath = "/etc/vp.conf"
} else {
configPath = "/etc/vp.conf"
}
}
//读取配置文件
err := proto.ReadConfig(configPath)
if err != nil {
panic("failed to read config file:" + err.Error())
}
}
func writeLogger(c *gin.Context) {
ip := c.ClientIP()

View File

@ -21,6 +21,7 @@ var ConfigRWLock = &sync.RWMutex{}
var SigningKeyRWLock = &sync.RWMutex{}
var SyncSecretReqLog int64
var CurrentConfigPath string
const (
MYSQL_USER = "video_t2"
@ -97,22 +98,12 @@ type ConfigStruct struct {
}
func WriteConfigToFile() {
//系统是linux、macos还是windows
var configPath string
if os.Getenv("OS") == "Windows_NT" {
configPath = "D:/Code/videoplayer/vp.conf"
} else if os.Getenv("OS") == "linux" {
//文件地址/home/saw-ai/saw-ai.conf
configPath = "/home/videoplayer/vp.conf"
} else {
configPath = "/home/videoplayer/vp.conf"
}
configData, err := json.MarshalIndent(Config, "", " ")
if err != nil {
log.Println("WriteConfigToFile json marshal error:", err)
return
}
err = os.WriteFile(configPath, configData, 0644)
err = os.WriteFile(CurrentConfigPath, configData, 0644)
if err != nil {
log.Println("WriteConfigToFile write file error:", err)
return
@ -123,6 +114,7 @@ func WriteConfigToFile() {
// 读取配置文件
func ReadConfig(path string) error {
//查看配置文件是否存在,不存在则创建
CurrentConfigPath = path
_, err := os.Stat(path)
if err != nil {
fmt.Println("Config file not found!")

View File

@ -191,6 +191,10 @@ func DelMonitorDeviceListWithStatus(userId int, deviceReq []proto.GetMonitorDevi
// 更新token密钥
func SyncTokenSecretFromUserCenter() {
secretSettings, err := GetTokenSecretFromUserCenter()
if err != nil {
log.Println("SyncTokenSecretFromUserCenter error:", err)
return
}
//写入redis
secretSettingsBytes, err2 := json.Marshal(secretSettings)
if err2 != nil {
@ -202,12 +206,8 @@ func SyncTokenSecretFromUserCenter() {
}
worker.SetRedis("secret_sync_settings", string(secretSettingsBytes)) //将密钥信息存入redis
if err != nil {
log.Println("SyncTokenSecretFromUserCenter error:", err)
return
}
if secretSettings.Curr != "" && secretSettings.Curr != proto.TOKEN_SECRET && secretSettings.Next == "" { //如果当前密钥不为空且不等于配置文件中的密钥,并且下一个密钥为空,则需要更新配置文件中的密钥
log.Printf("SyncTokenSecretFromUserCenter current secret is not equal to config secret, current: %s, config: %s\n", secretSettings.Curr, proto.TOKEN_SECRET)
if secretSettings.Curr != "" && secretSettings.Curr != proto.Config.TOKEN_SECRET && secretSettings.Next == "" { //如果当前密钥不为空且不等于配置文件中的密钥,并且下一个密钥为空,则需要更新配置文件中的密钥
log.Printf("SyncTokenSecretFromUserCenter current secret is not equal to config secret, current: %s, config: %s\n", secretSettings.Curr, proto.Config.TOKEN_SECRET)
//如果当前密钥与配置文件中的密钥不一致,则需要更新配置文件中的密钥
proto.SigningKeyRWLock.Lock()
proto.SigningKey = []byte(secretSettings.Curr)
@ -227,7 +227,6 @@ func SyncTokenSecretFromUserCenter() {
proto.SyncSecretReqLog++ //记录同步密钥请求次数
}
func SetNextSecretToCurrent(secret_copy proto.SecretSyncSettings) {
var secret_sync_settings proto.SecretSyncSettings
redisKey := "secret_sync_settings"
@ -300,13 +299,18 @@ func GetTokenSecretFromUserCenter() (*proto.SecretSyncSettings, error) {
log.Println("GetTokenSecretFromUserCenter json unmarshal error:", err)
return nil, err
}
if respObject.Code != 0 {
log.Println("GetTokenSecretFromUserCenter error code:", respObject.Code, "\t, message:", respObject.Message)
return nil, fmt.Errorf("GetTokenSecretFromUserCenter error code: %d, message: %s", respObject.Code, respObject.Message)
}
//对称加密密钥。通过密钥加 secret_key 取md5
secretKeyMd5 := worker.GenerateMD5(proto.TOKEN_SECRET + "_sync_secret")
secretKeyMd5 := worker.GenerateMD5(proto.Config.TOKEN_SECRET + "_sync_secret")
//解密返回数据
dataContent, err2 := worker.AESDecrypt(respObject.Data, []byte(secretKeyMd5))
if err2 != nil {
log.Println("GetTokenSecretFromUserCenter aes decrypt error:", err2)
log.Println("GetTokenSecretFromUserCenter aes decrypt error:", err2, "\t, secret:", proto.Config.TOKEN_SECRET, "\t, secretKey:", secretKeyMd5, "\t, data:", respObject.Data)
return nil, err2
}
var secretResp proto.SecretSyncSettings