七牛 CDN 时间戳防盗链签名实现

简介

最近用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 协议》,转载必须注明作者和本文链接
讨论数量: 1
sane

有的呀
文档

github 源码 中的 767 行 MakePrivateURL

2年前 评论
zxr615 (楼主) 2年前
sane (作者) 2年前
zxr615 (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!