全部产品
Search
文档中心

Edge Security Acceleration:Contoh penandatanganan URL

更新时间:Jul 06, 2025

Topik ini menggunakan demo Python untuk menunjukkan cara mengimplementasikan tiga jenis penandatanganan URL.

Demo Python

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

Blok kode berikut menunjukkan demo tersebut.

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

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

  • Python 2 menggunakan pengkodean ASCII, sedangkan Python 3 menggunakan pengkodean UTF-8. Anda perlu menggunakan pengkodean UTF-8 untuk melewati hash. 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)
    # Bagian berikut menunjukkan 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 time-to-live (TTL) yang ditetapkan oleh server penandatanganan untuk URL yang ditandatangani. Anda dapat menyesuaikan nilai tersebut sesuai kebutuhan. Unit: detik. Nilai TTL yang ditetapkan oleh server penandatanganan tidak terkait dengan nilai TTL yang ditetapkan oleh DCDN. 
    # Periode validitas URL yang ditandatangani = timestamp UNIX yang dihasilkan pada server penandatanganan + TTL yang ditetapkan oleh server penandatanganan + TTL yang ditetapkan oleh DCDN.
    # Untuk penandatanganan tipe A, jika timestamp UNIX yang dihasilkan pada server penandatanganan adalah 1444435200, nilai TTL yang ditetapkan oleh server penandatanganan adalah 3600, dan nilai TTL yang ditetapkan oleh DCDN adalah 1800, maka periode validitas URL adalah 1444440600 (1444435200 + 3600 + 1800).
    # Bagian berikut menunjukkan cara mengimplementasikan penandatanganan tipe A:
    authuri = a_auth(uri, key, exp)                     # tipe autentikasi: 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)
    # Bagian berikut menunjukkan 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 time-to-live (TTL) yang ditetapkan oleh server penandatanganan untuk URL yang ditandatangani. Anda dapat menyesuaikan nilai tersebut sesuai kebutuhan. Unit: detik. Nilai TTL yang ditetapkan oleh server penandatanganan tidak terkait dengan nilai TTL yang ditetapkan oleh DCDN. 
    # Periode validitas URL yang ditandatangani = timestamp UNIX yang dihasilkan pada server penandatanganan + TTL yang ditetapkan oleh server penandatanganan + TTL yang ditetapkan oleh DCDN.
    # Untuk penandatanganan tipe A, jika timestamp UNIX yang dihasilkan pada server penandatanganan adalah 1444435200, nilai TTL yang ditetapkan oleh server penandatanganan adalah 3600, dan nilai TTL yang ditetapkan oleh DCDN adalah 1800, maka periode validitas URL adalah 1444440600 (1444435200 + 3600 + 1800).
    # Bagian berikut menunjukkan cara mengimplementasikan penandatanganan tipe A:
    authuri = a_auth(uri, key, exp)                     # tipe autentikasi: a_auth / b_auth / c_auth
    print("URL : %s\nAUTH: %s" %(uri, authuri))
if __name__ == "__main__":
    main()