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()