简介
最近用Go
做新项目,需要用到七牛家的时间戳防盗链
,sdk
内似乎没找到签名方法,所以按照文档写了一遍,供大家参考。
七牛官方文档地址:
developer.qiniu.com/fusion/3841/ti...
调用
func main() { | |
sign, _ := GenThpfSign(uri, key,exp) | |
fmt.Println(sign) | |
} |
含测试代码
func main() { | |
uri := "https://xxx.yyy.com/DIR1/中文/vodfile.mp4?v=1.2" | |
key := "9388f4ba63b89bba5b9b84aa70a92eaac099d39b" | |
exp := 3600 | |
want := "https://xxx.yyy.com/DIR1/%E4%B8%AD%E6%96%87/vodfile.mp4?v=1.2&sign=b4b7f94dd7817ce0283b5491861c3936&t=55bb9b80" | |
sign, err := GenThpfSign(uri, key,exp) | |
// 测试要把 GenThpfSign expireUnix 变量换成注释的时间戳// --------- START TEST ------------if err != nil { | |
fmt.Println(err) | |
os.Exit(0)} | |
if sign != want { | |
fmt.Printf("sign=%s\n", sign) | |
fmt.Printf("want=%s\n", want) | |
os.Exit(0)} | |
// --------- ENDING TEST ------------ | |
fmt.Println(sign) | |
} |
获取 sign 方法
测试时需要把 expireUnix 变量替换成注释中的时间戳
// GenThpfSign 获取时间戳防盗链 | |
// GenThpfSign thpf:timestamp hotlinking prevention fusion | |
// @doc https://developer.qiniu.com/fusion/3841/timestamp-hotlinking-prevention-fusion | |
func GenThpfSign(uri, key string, expireTime int) (string, error) { | |
scheme, host, path, query, err := urlParse(uri)if err != nil {return "", err | |
} | |
// 获取 sign | |
expireUnix := time.Now().Unix() + int64(expireTime)// 供测试使用// expireUnix := int64(1438358400)// 将时间转换成16进制 | |
t := strconv.FormatInt(expireUnix, 16) | |
encodePath := urlEncode(path) | |
signStr := fmt.Sprintf("%s%s%s", key, encodePath, t) | |
sign := strings.ToLower(toMd5(signStr)) | |
fullUrl := fmt.Sprintf("%s://%s%s?%s&sign=%s&t=%s", scheme, host, encodePath, query, sign, t) | |
return fullUrl, nil | |
} |
urlEncode 方法
// url_encode 不编码斜线: "/" | |
func urlEncode(str string) string { | |
n := strings.ReplaceAll(str, "/", "_") | |
s := strings.ReplaceAll(url.QueryEscape(n), "_", "/") | |
return s | |
} |
返回 url 的各个部分
// 返回 url 的各个部分 | |
func urlParse(uri string) (string, string, string, string, error) { | |
parse, err := url.Parse(uri)if err != nil {return "", "", "", "", err | |
} | |
scheme := parse.Scheme | |
host := parse.Host | |
path := parse.Path | |
query := parse.RawQuery | |
return scheme, host, path, query, nil | |
} |
md5 string
func toMd5(str string) string { | |
h := md5.New() | |
io.WriteString(h, str)return fmt.Sprintf("%x", h.Sum(nil)) | |
} |