编号 | -用户名 | -昵称 | -手机号 | -创建日期 | -更新日期 | -可用状态 | -在线状态 | -操作 | -
---|
1. 新增调用方,输入调用方标识、调用方对接人、备注等信息;
-2. 授权调用方可调用的接口;
-3. 查看详情,将调用方的 KEY
、SECRET
发给调用方;
基于 HTTP Header 中的两个参数 Authorization
、Authorization-Date
存储签名信息。
1. Authorization 存储签名信息,格式:调用方 KEY + 空格分隔符 + 摘要(加密串),例如:
-Authorization:blog MjJjMDE1MWFkZjMwOWFmYjFlNzViNDFjYjYwMWFlMmM=-
2. Authorization-Date 存储时间信息,格式:0000-00-00 00:00:00,使用 Asia/Shanghai
时区,例如;
Authorization-Date:2021-04-03 21:12:36-
-func New(key, secret string, ttl time.Duration) Signature { - return &signature{ - key: key, - secret: secret, - ttl: ttl, - } -} - -// Generate -// path 请求的路径 (不附带 querystring) -func (s *signature) Generate(path string, method string, params url.Values) (authorization, date string, err error) { - if path == "" { - err = errors.New("path required") - return - } - - if method == "" { - err = errors.New("method required") - return - } - - methodName := strings.ToUpper(method) - if !methods[methodName] { - err = errors.New("method param error") - return - } - - // Date - date = time_parse.CSTLayoutString() - - // Encode() 方法中自带 sorted by key - sortParamsEncode, err := url.QueryUnescape(params.Encode()) - if err != nil { - err = errors.Errorf("url QueryUnescape %v", err) - return - } - - // 加密字符串规则 - buffer := bytes.NewBuffer(nil) - buffer.WriteString(path) - buffer.WriteString(delimiter) - buffer.WriteString(methodName) - buffer.WriteString(delimiter) - buffer.WriteString(sortParamsEncode) - buffer.WriteString(delimiter) - buffer.WriteString(date) - - // 对数据进行 sha256 加密,并进行 base64 encode - hash := hmac.New(sha256.New, []byte(s.secret)) - hash.Write(buffer.Bytes()) - digest := base64.StdEncoding.EncodeToString(hash.Sum(nil)) - - authorization = fmt.Sprintf("%s %s", s.key, digest) - return -} - -// 模拟数据 -const ( - key = "blog" - secret = "i1ydX9RtHyuJTrw7frcu" - ttl = time.Minute * 10 -) - -func TestSignature_Generate(t *testing.T) { - path := "/echo" - method := "POST" - - params := url.Values{} - params.Add("a", "a1") - params.Add("d", "d1") - params.Add("c", "c1 c2*") - - authorization, date, err := New(key, secret, ttl).Generate(path, method, params) - t.Log("authorization:", authorization) - t.Log("authorization-date:", date) - t.Log("err:", err) -} --
-// 模拟数据 -$key = "blog"; -$secret = "i1ydX9RtHyuJTrw7frcu"; - -$path = "/echo"; -$method = "POST"; - -$params['a'] = "a1"; -$params['d'] = "d1"; -$params['c'] = "c1 c2*"; - -// 对 params key 进行排序 -ksort($params); - -// 对 sortParams 进行操作 -$sortParamsEncode = rawurldecode(http_build_query($params, "", "&", PHP_QUERY_RFC3986)); - -// 时间 使用 Asia/Shanghai 时区 -$date = date("Y-m-d H:i:s", time()); - -// 加密字符串规则 -$encryptStr = $path."|".strtoupper($method)."|".$sortParamsEncode."|".$date; - -// 对数据进行 sha256 加密,并进行 base64 encode -$digest = base64_encode(hash_hmac("sha256", $encryptStr, $secret, true)); - -$authorization = $key." ".$digest; - -echo "authorization:{$authorization}"; -echo "---"; -echo "authorization-date:{$date}"; --
-let key = "blog"; -let secret = "i1ydX9RtHyuJTrw7frcu"; - -let date = new Date(); -let datetime = date.getFullYear() + "-" // "年" - + ((date.getMonth() + 1) > 10 ? (date.getMonth() + 1) : "0" + (date.getMonth() + 1)) + "-" // "月" - + (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " " // "日" - + (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":" // "小时" - + (date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) + ":" // "分钟" - + (date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds()); // "秒" - -let path = "/echo"; -let method = "POST"; -let params = {a:'a1', d:'d1', c: 'c1 c2*'}; - -let sortParamsEncode = decodeURIComponent(jQuery.param(ksort(params))); -let encryptStr = path + "|" + method.toUpperCase() + "|" + sortParamsEncode + "|" + datetime; -let digest = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(encryptStr, secret)); -console.log({authorization: key + " " + digest, date: datetime}); --
编号 | -调用方 | -对接人 | -创建日期 | -更新日期 | -状态 | -操作 | -
---|
服务级错误码
{{$value.Code}}
{{$value.Message}}模块级错误码
{{$value.Code}}
{{$value.Message}}编号 | -任务名称 | -cron 表达式 | -执行方式 | -超时限制(秒) | -重试次数 | -重试间隔(秒) | -通知方式 | -创建人 | -创建日期 | -可用状态 | -操作 | -
---|
- - -
- -- - -
- -所需版本:go{{.MinGoVersion}}+
(当前版本 {{.GoVersion}}
)
请确保此数据库已存在!
- 发现代码运行报错或缺少表字段,如何进行服务初始化?
-1、删除根目录文件: - {{ .LockFile }} - 。 -
-2、重新启动服务。
- -发现 GitHub 仓库更新了新代码,如何进行服务升级?
-1、源代码升级: - 拉取最新代码,覆盖旧版本代码即可。 -
-2、数据表升级:
- -数据表 | -是否存在 | -操作 | -
---|---|---|
{{$value.TableName}} | -- {{if eq $value.IsHave 1}} 已存在 - {{else}} 不存在 - {{end}} - | -- - - | -
- v1.2.6 - -> - v1.2.7 -
- -1、源代码升级: - 拉取最新代码,覆盖旧版本代码即可。 -
-2、数据表升级: - 创建 cron_task 表结构 -
-3、系统管理员->菜单管理,新增侧边栏:后台任务模块,同时添加菜单栏的功能权限。
-4、系统管理员->管理员,对管理员进行菜单授权。
-5、退出重新登录,即可以看到自己新增的模块。
- -- v1.2.7 - -> - v1.2.8 -
- -1、源代码升级: - 拉取最新代码,覆盖旧版本代码即可。 -
-2、系统管理员->菜单管理,新增侧边栏:实用工具箱 -> WebSocket,同时添加菜单栏的功能权限。
-3、系统管理员->管理员,对管理员进行菜单授权。
-4、退出重新登录,即可以看到自己新增的模块。
- -- -
推荐使用: ELK 组件
,本功能仅仅是读取文本进行展示。
仅展示最新的 100 条日志。
{{$value.Msg}}
-
- {{else}}
-
- {{$value.Level}}
- {{$value.Time}}
- {{$value.Method}}
- {{$value.HTTPCode}}
- {{$value.TraceID}}
- {{$value.CostSeconds}} s
- {{$value.Path}}
-
- {{end}}
-
- {{$value.Content}}-
- -
- -
-
-
|
-