簡介
最近用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))
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結