mod_secure_link
模块简介
mod_secure_link 校验请求链接是否授权,保护链接不被未授权访问,同时还限制链接的有效期。
基础配置
配置描述
模块基础配置文件: conf/mod_secure_link/mod_secure_link.conf
| 配置项 | 描述 |
|---|---|
| Basic.DataPath | String 规则配置文件路径 |
| Log.OpenDebug | Bool 是否启用模块调试日志开关 |
配置示例
[Basic]DataPath = ./mod_secure_link/secure_link.data[Log]OpenDebug = true
规则配置
配置描述
模块规则配置文件:conf/mod_secure_link/secure_link_rule.data
| 配置项 | 描述 |
|---|---|
| Version | String 配置文件版本 |
| Config | Object 各产品线的规则配置 |
| Config[k] | String 产品线名称 |
| Config[v] | Object 产品线规则列表 |
| Config[v][].Cond | String 规则条件, 语法详见Condition |
| Config[v][].ChecksumKey | String Query 存放签名结果的key |
| Config[v][].ExpiresKey | String Query 存放签名过期时间戳的key |
| Config[v][].ExpressionNodes | Array 参与签名的数据节点列表 |
| Config[v][].ExpressionNodes[].Type | String 参与签名的数据节点的类型,参考Node Type |
| Config[v][].ExpressionNodes[].Param | String 参与签名的数据节点的取值使用的key |
Node Type
当前支持的类型和取值规则有:
| type | 取值逻辑 |
|---|---|
| label | $Param |
| query | req.URL.Query($Param) |
| header | req.Header.Get($Param) |
| host | req.Host |
| uri | req.RequestURI |
| remote_addr | req.RemoteAddr |
配置示例
{"Version": "2019-12-10184356","Config": {"p1": [{"Cond": "default_t()","ChecksumKey": "sign","ExpiresKey": "time","ExpressionNodes": [{"Type": "query","Param": "time"},{"Type": "uri"},{"Type": "remote_addr"},{"Type": "label","Param": " secret"}]}]}}
Link生成逻辑
以上述配置举例,Path的生成逻辑为:
func WrapSecureLinkParam (req *http.Request) {now := time.Now().Unix()expires := now + int64(time.Hour*24/time.Second)// step1: get origin dataorigin := fmt.Sprintf("%d%s%s%s", expires, req.RequestURI, req.RemoteAddr, " secret")// step2: generator signsign := func(origin string) string {tmpB := md5.Sum([]byte(origin))tmp := base64.StdEncoding.EncodeToString(tmpB[:])tmp = strings.ReplaceAll(tmp, "+", "-")tmp = strings.ReplaceAll(tmp, "/", "_")tmp = strings.ReplaceAll(tmp, "=", "")return tmp}// step3: generate linkreq.URL.Query().Set("sign", sign(origin))req.URL.Query().Set("time", fmt.Sprintf("%d", expires))}
step2 的逻辑用shell命令表示为:
echo -n $origin | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =// one example:echo -n '2147483647/s/link127.0.0.1 secret' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =_e4Nc3iduzkWRm01TBBNYw