diff --git a/kenaito-conf-springboot2-client/src/main/java/cn/odboy/confcenter/ConfigcenterContext.java b/kenaito-conf-springboot2-client/src/main/java/cn/odboy/confcenter/ConfigcenterContext.java index cadbe7a..0e0a732 100644 --- a/kenaito-conf-springboot2-client/src/main/java/cn/odboy/confcenter/ConfigcenterContext.java +++ b/kenaito-conf-springboot2-client/src/main/java/cn/odboy/confcenter/ConfigcenterContext.java @@ -483,12 +483,10 @@ public class ConfigcenterContext { } public String buildTokenParameter(String url) { - if (token == null || token.length() < 8) { + if (token == null || token.isEmpty()) { return url; } - String str = md5Short(token).concat(String.valueOf(new Date().getTime())); - String authtoken = desEncrypt(token.substring(0, 8), str).toLowerCase(); - return url + (url.contains("?") ? "&" : "?") + "authtoken=" + authtoken; + return url + (url.contains("?") ? "&" : "?") + "token=" + token; } public void close() { diff --git a/kenaito-conf-springboot3-client/src/main/java/cn/odboy/confcenter/ConfigcenterContext.java b/kenaito-conf-springboot3-client/src/main/java/cn/odboy/confcenter/ConfigcenterContext.java index c31625b..8ecb3cb 100644 --- a/kenaito-conf-springboot3-client/src/main/java/cn/odboy/confcenter/ConfigcenterContext.java +++ b/kenaito-conf-springboot3-client/src/main/java/cn/odboy/confcenter/ConfigcenterContext.java @@ -355,12 +355,10 @@ public class ConfigcenterContext { } public String buildTokenParameter(String url) { - if (token == null || token.length() < 8) { + if (token == null || token.isEmpty()) { return url; } - String str = md5Short(token).concat(String.valueOf(new Date().getTime())); - String authtoken = desEncrypt(token.substring(0, 8), str).toLowerCase(); - return url + (url.contains("?") ? "&" : "?") + "authtoken=" + authtoken; + return url + (url.contains("?") ? "&" : "?") + "token=" + token; } public void close() { diff --git a/nodejs-client/lib/client.js b/nodejs-client/lib/client.js index cee77a4..a49ca4a 100644 --- a/nodejs-client/lib/client.js +++ b/nodejs-client/lib/client.js @@ -62,7 +62,7 @@ export class ConfigClient { } async fetchAll() { - const url = `${this.config.baseUrl}/api/fetchAllConfigs?appName=${encodeURIComponent(this.config.appName)}&env=${encodeURIComponent(this.config.env)}&version=${encodeURIComponent(this.config.version)}&ignoreGlobal=${this.config.ignoreGlobal}`; + const url = `${this.config.baseUrl}/api/fetchAllConfigs?appName=${encodeURIComponent(this.config.appName)}&env=${encodeURIComponent(this.config.env)}&version=${encodeURIComponent(this.config.version)}&ignoreGlobal=${this.config.ignoreGlobal}&token=${encodeURIComponent(this.config.token)}`; const resp = await fetch(url, { headers: this.config.token ? { Authorization: `Bearer ${this.config.token}` } : {}, signal: AbortSignal.timeout(10000), @@ -101,6 +101,7 @@ export class ConfigClient { version: this.config.version, lastTime: this.lastTime, ignoreGlobal: this.config.ignoreGlobal, + token: this.config.token, }; const resp = await fetch(url, { method: 'POST', diff --git a/python-client/kenaito_conf/client.py b/python-client/kenaito_conf/client.py index f999375..24165a4 100644 --- a/python-client/kenaito_conf/client.py +++ b/python-client/kenaito_conf/client.py @@ -66,6 +66,7 @@ class ConfigClient: f"&env={self._config.env}" f"&version={self._config.version}" f"&ignoreGlobal={str(self._config.ignore_global).lower()}" + f"&token={self._config.token}" ) resp = requests.get(url, timeout=10) resp.raise_for_status() @@ -98,6 +99,7 @@ class ConfigClient: "version": self._config.version, "lastTime": self._last_time, "ignoreGlobal": self._config.ignore_global, + "token": self._config.token, } resp = requests.post(url, json=payload, timeout=10) resp.raise_for_status() diff --git a/server/internal/handler/config_api.go b/server/internal/handler/config_api.go index 30f0813..9b5de8e 100644 --- a/server/internal/handler/config_api.go +++ b/server/internal/handler/config_api.go @@ -26,6 +26,7 @@ func (h *ConfigApiHandler) FetchAllConfigs(c *gin.Context) { env := c.Query("env") version := c.DefaultQuery("version", "latest") ignoreGlobal := c.DefaultQuery("ignoreGlobal", "false") == "true" + token := c.Query("token") if appName == "" || env == "" { c.JSON(http.StatusBadRequest, model.WrapperResponse{Code: 400, Msg: "参数缺失"}) @@ -40,6 +41,12 @@ func (h *ConfigApiHandler) FetchAllConfigs(c *gin.Context) { return } + // validate token if app has token configured + if app.Token != "" && app.Token != token { + c.JSON(http.StatusForbidden, model.WrapperResponse{Code: 403, Msg: "Token 无效"}) + return + } + result := make(map[string]interface{}) // load global configs @@ -101,6 +108,7 @@ type FetchChangedRequest struct { LastTime int64 `json:"lastTime" binding:"required"` IgnoreGlobal bool `json:"ignoreGlobal"` FetchAll bool `json:"fetchAll"` + Token string `json:"token"` } func (h *ConfigApiHandler) FetchChangedConfigs(c *gin.Context) { @@ -117,6 +125,12 @@ func (h *ConfigApiHandler) FetchChangedConfigs(c *gin.Context) { return } + // validate token if app has token configured + if app.Token != "" && app.Token != req.Token { + c.JSON(http.StatusForbidden, model.WrapperResponse{Code: 403, Msg: "Token 无效"}) + return + } + version := req.Version if version == "" { version = "latest" diff --git a/web/src/api/app.js b/web/src/api/app.js index b25590d..2af89a6 100644 --- a/web/src/api/app.js +++ b/web/src/api/app.js @@ -51,3 +51,17 @@ export function getAppOptions() { method: 'get' }) } + +export function generateToken(id) { + return request({ + url: `/admin/app/generateToken/${id}`, + method: 'post' + }) +} + +export function deleteToken(id) { + return request({ + url: `/admin/app/deleteToken/${id}`, + method: 'post' + }) +} diff --git a/web/src/views/app/AppList.vue b/web/src/views/app/AppList.vue index 3ae615e..bd48ebc 100644 --- a/web/src/views/app/AppList.vue +++ b/web/src/views/app/AppList.vue @@ -10,14 +10,23 @@ + + + - + @@ -62,7 +71,7 @@