All Products
Search
Document Center

CDN:Contoh penandatanganan URL

Last Updated:Jun 27, 2025

Topik ini menggunakan demo Python untuk menunjukkan implementasi penandatanganan Tipe A, Tipe B, dan Tipe C.

Kode contoh:

Untuk informasi lebih lanjut tentang jenis-jenis penandatanganan URL, lihat topik-topik berikut:

Contoh:

Catatan
  • Python memiliki dua versi utama: Python 2 dan Python 3. Python 3 tidak kompatibel dengan Python 2. Oleh karena itu, kode contoh disediakan untuk kedua versi tersebut.

  • Jika URL mengandung karakter Cina, enkode URL tersebut menggunakan fungsi UrlEncode() sebelum menjalankan kode penandatanganan URL.

  • Python 2 menggunakan pengkodean ASCII, sedangkan Python 3 menggunakan pengkodean UTF-8. Untuk melewati hash, pengkodean UTF-8 diperlukan. Oleh karena itu, pengkodean UTF-8 ditambahkan ke fungsi hashlib.md5() dalam kode contoh untuk Python 3.

Python3

import re
import time
import hashlib
import datetime
def md5sum(src):
    m = hashlib.md5()
    m.update(src.encode(encoding='utf-8'))                                    # Tambahkan operasi pengkodean UTF-8.
    return m.hexdigest()
    # Penandatanganan Tipe A
def a_auth(uri, key, exp):
    p = re.compile("^(http://|https://)?([^/?]+)(/[^?]*)?(\\?.*)?$")
    if not p:
        return None
    m = p.match(uri)
    scheme, host, path, args = m.groups()
    if not scheme: scheme = "http://"
    if not path: path = "/"
    if not args: args = ""
    rand = "0"      # "0" secara default, nilai lain juga bisa
    uid = "0"       # "0" secara default, nilai lain juga bisa
    sstring = "%s-%s-%s-%s-%s" %(path, exp, rand, uid, key)
    hashvalue = md5sum(sstring)
    auth_key = "%s-%s-%s-%s" %(exp, rand, uid, hashvalue)
    if args:
        return "%s%s%s%s&auth_key=%s" %(scheme, host, path, args, auth_key)
    else:
        return "%s%s%s%s?auth_key=%s" %(scheme, host, path, args, auth_key)
    # Penandatanganan Tipe B
def b_auth(uri, key, exp):
    p = re.compile("^(http://|https://)?([^/?]+)(/[^?]*)?(\\?.*)?$")
    if not p:
        return None
    m = p.match(uri)
    scheme, host, path, args = m.groups()
    if not scheme: scheme = "http://"
    if not path: path = "/"
    if not args: args = ""
    # konversi timestamp unix ke format "YYmmDDHHMM"
    nexp = datetime.datetime.fromtimestamp(exp).strftime('%Y%m%d%H%M')
    sstring = key + nexp + path
    hashvalue = md5sum(sstring)
    return "%s%s/%s/%s%s%s" %(scheme, host, nexp, hashvalue, path, args)
    # Penandatanganan Tipe C
def c_auth(uri, key, exp):
    p = re.compile("^(http://|https://)?([^/?]+)(/[^?]*)?(\\?.*)?$")
    if not p:
        return None
    m = p.match(uri)
    scheme, host, path, args = m.groups()
    if not scheme: scheme = "http://"
    if not path: path = "/"
    if not args: args = ""
    hexexp = "%x" %exp
    sstring = key + path + hexexp
    hashvalue = md5sum(sstring)
    return "%s%s/%s/%s%s%s" %(scheme, host, hashvalue, hexexp, path, args)
    # Blok kode berikut menunjukkan nilai-nilai parameter uri, key, dan exp:
def main():
    uri = "http://example.aliyundoc.com/ping?foo=bar"            # uri asli
    key = "<input private key>"                         # kunci privat otorisasi
    exp = int(time.time()) + 1 * 3600                   # waktu kedaluwarsa: 1 jam setelah waktu saat ini
    # "1 * 3600" menentukan nilai TTL yang diberikan oleh server penandatanganan kepada URL yang telah ditandatangani. Anda dapat menentukan nilai berdasarkan kebutuhan bisnis Anda. Unit: detik. Nilai TTL yang diberikan oleh server penandatanganan tidak terkait dengan nilai TTL yang diberikan oleh Alibaba Cloud CDN.
    # Masa berlaku URL yang telah ditandatangani = timestamp UNIX yang dihasilkan pada server penandatanganan + TTL yang diberikan oleh server penandatanganan + TTL yang diberikan oleh Alibaba Cloud CDN.
    # Untuk penandatanganan Tipe A, jika timestamp UNIX yang dihasilkan pada server penandatanganan adalah 1444435200, nilai TTL yang diberikan oleh server penandatanganan adalah 3600, dan nilai TTL yang diberikan oleh Alibaba Cloud CDN adalah 1800, masa berlaku URL adalah 1444440600 (1444435200 + 3600 + 1800).
    # Contoh berikut menunjukkan cara mengimplementasikan penandatanganan Tipe A:
    authuri = a_auth(uri, key, exp)                     # tipe otentikasi: a_auth / b_auth / c_auth
    print("URL : %s\nAUTH: %s" %(uri, authuri))
if __name__ == "__main__":
    main()

Python2

import re
import time
import hashlib
import datetime
def md5sum(src):
    m = hashlib.md5()
    m.update(src)
    return m.hexdigest()
    # Penandatanganan Tipe A
def a_auth(uri, key, exp):
    p = re.compile("^(http://|https://)?([^/?]+)(/[^?]*)?(\\?.*)?$")
    if not p:
        return None
    m = p.match(uri)
    scheme, host, path, args = m.groups()
    if not scheme: scheme = "http://"
    if not path: path = "/"
    if not args: args = ""
    rand = "0"      # "0" secara default, nilai lain juga bisa
    uid = "0"       # "0" secara default, nilai lain juga bisa
    sstring = "%s-%s-%s-%s-%s" %(path, exp, rand, uid, key)
    hashvalue = md5sum(sstring)
    auth_key = "%s-%s-%s-%s" %(exp, rand, uid, hashvalue)
    if args:
        return "%s%s%s%s&auth_key=%s" %(scheme, host, path, args, auth_key)
    else:
        return "%s%s%s%s?auth_key=%s" %(scheme, host, path, args, auth_key)
    # Penandatanganan Tipe B
def b_auth(uri, key, exp):
    p = re.compile("^(http://|https://)?([^/?]+)(/[^?]*)?(\\?.*)?$")
    if not p:
        return None
    m = p.match(uri)
    scheme, host, path, args = m.groups()
    if not scheme: scheme = "http://"
    if not path: path = "/"
    if not args: args = ""
    # konversi timestamp unix ke format "YYmmDDHHMM"
    nexp = datetime.datetime.fromtimestamp(exp).strftime('%Y%m%d%H%M')
    sstring = key + nexp + path
    hashvalue = md5sum(sstring)
    return "%s%s/%s/%s%s%s" %(scheme, host, nexp, hashvalue, path, args)
    # Penandatanganan Tipe C
def c_auth(uri, key, exp):
    p = re.compile("^(http://|https://)?([^/?]+)(/[^?]*)?(\\?.*)?$")
    if not p:
        return None
    m = p.match(uri)
    scheme, host, path, args = m.groups()
    if not scheme: scheme = "http://"
    if not path: path = "/"
    if not args: args = ""
    hexexp = "%x" %exp
    sstring = key + path + hexexp
    hashvalue = md5sum(sstring)
    return "%s%s/%s/%s%s%s" %(scheme, host, hashvalue, hexexp, path, args)
    # Blok kode berikut menunjukkan nilai-nilai parameter uri, key, dan exp:
def main():
    uri = "http://example.aliyundoc.com/ping?foo=bar"            # uri asli
    key = "<input private key>"                         # kunci privat otorisasi
    exp = int(time.time()) + 1 * 3600                   # waktu kedaluwarsa: 1 jam setelah waktu saat ini
    # "1 * 3600" menentukan nilai TTL yang diberikan oleh server penandatanganan kepada URL yang telah ditandatangani. Anda dapat menentukan nilai berdasarkan kebutuhan bisnis Anda. Unit: detik. Nilai TTL yang diberikan oleh server penandatanganan tidak terkait dengan nilai TTL yang diberikan oleh Alibaba Cloud CDN.
    # Masa berlaku URL yang telah ditandatangani = timestamp UNIX yang dihasilkan pada server penandatanganan + TTL yang diberikan oleh server penandatanganan + TTL yang diberikan oleh Alibaba Cloud CDN.
    # Untuk penandatanganan Tipe A, jika timestamp UNIX yang dihasilkan pada server penandatanganan adalah 1444435200, nilai TTL yang diberikan oleh server penandatanganan adalah 3600, dan nilai TTL yang diberikan oleh Alibaba Cloud CDN adalah 1800, masa berlaku URL adalah 1444440600 (1444435200 + 3600 + 1800).
    # Contoh berikut menunjukkan cara mengimplementasikan penandatanganan Tipe A:
    authuri = a_auth(uri, key, exp)                     # tipe otentikasi: a_auth / b_auth / c_auth
    print("URL : %s\nAUTH: %s" %(uri, authuri))
if __name__ == "__main__":
    main()