全部产品
Search
文档中心

Object Storage Service:Callback

更新时间:Jul 06, 2025

Setelah objek diunggah ke Object Storage Service (OSS), OSS dapat secara otomatis mengirimkan permintaan callback untuk memberi tahu server aplikasi agar melakukan operasi selanjutnya.

Catatan penggunaan

  • Batasan Wilayah

    Callbacks didukung di wilayah-wilayah berikut: Cina (Hangzhou), Cina (Shanghai), Cina (Qingdao), Cina (Beijing), Cina (Zhangjiakou), Cina (Hohhot), Cina (Ulanqab), Cina (Shenzhen), Cina (Heyuan), Cina (Guangzhou), Cina (Chengdu), Cina (Hong Kong), AS (Silicon Valley), AS (Virginia), Jepang (Tokyo), Singapura, Malaysia (Kuala Lumpur), Indonesia (Jakarta), Filipina (Manila), Jerman (Frankfurt), Inggris (London), dan UEA (Dubai).

  • Logika Callback

    • Jika permintaan callback tidak menerima respons dalam waktu 5 detik setelah OSS mengirimkan permintaan, OSS menentukan bahwa permintaan tersebut telah habis waktu.

    • Objek yang diunggah tetap disimpan di OSS terlepas dari apakah permintaan upload callback berhasil atau gagal.

    • Jika permintaan callback gagal, permintaan callback tidak akan diulang.

  • Operasi yang Didukung

    Hanya operasi PutObject, PostObject, dan CompleteMultipartUpload yang mendukung callbacks.

Proses callback

Langkah-langkah:

  1. Klien Mengunggah Objek dengan Parameter Callback yang Ditentukan

    Saat klien mengunggah objek, tentukan parameter callback, yang mencakup URL server aplikasi dan konten callback. Klien dapat mengonfigurasi parameter kustom menggunakan parameter callback-var.

  2. OSS Menyimpan Objek dan Mengirimkan Permintaan Callback

    Setelah objek diunggah, OSS mengirimkan permintaan POST ke URL server aplikasi. Permintaan tersebut berisi informasi objek, seperti nama bucket, nama objek, ukuran objek, ETag objek, dan parameter kustom.

  3. Server Aplikasi Memproses Permintaan Callback dan Mengembalikan Respons

    Setelah server aplikasi menerima permintaan callback, server aplikasi memverifikasi tanda tangan permintaan (opsional) untuk memastikan keamanan, memproses permintaan callback dalam waktu 5 detik, dan mengembalikan respons dalam format JSON. Kode status HTTP 200 menunjukkan bahwa panggilan berhasil. Kode status HTTP lainnya menunjukkan bahwa panggilan gagal.

  4. OSS Mengembalikan Hasil Unggah dan Callback

    Setelah OSS menerima respons callback, OSS mengembalikan hasil unggah dan callback ke klien.

Langkah-langkah untuk mengonfigurasi upload callbacks

Pengujian upload callback terdiri dari dua bagian: mengunggah objek dari klien dan memproses permintaan callback pada server aplikasi. Kami merekomendasikan Anda untuk men-debug unggahan objek terlebih dahulu, kemudian men-debug pemrosesan permintaan callback. Setelah kedua bagian selesai di-debug, lakukan pengujian gabungan.

Debug unggahan objek

Berikut ini menjelaskan cara membuat dan memproses logika serta memproses parameter upload callback. Untuk dengan cepat mengimplementasikan fitur upload callback, kami merekomendasikan Anda merujuk pada kode contoh yang disediakan untuk OSS SDKs.

Untuk memungkinkan OSS secara otomatis memicu callback setelah objek diunggah, Anda harus menentukan parameter berikut dalam permintaan unggah: callback dan callback-var (opsional).

  1. Buat Parameter Callback

    Parameter callback digunakan untuk menentukan URL server aplikasi dan format konten permintaan. Parameter ini harus dibuat dalam format JSON dan dienkripsi dalam Base64.

    1. Contoh Konfigurasi Sederhana:

      {
      "callbackUrl":"http://oss-demo.aliyuncs.com:23450",
      "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}"
      }

      • callbackUrl: URL server aplikasi. http://oss-demo.aliyuncs.com:23450 digunakan dalam contoh ini.

      • callbackBody: badan permintaan callback. Bidang callbackBody mendukung variabel sistem, seperti ${bucket} dan ${object}, serta variabel kustom. Untuk informasi lebih lanjut tentang variabel sistem, lihat Variabel Sistem yang Didukung oleh callbackBody.

    2. Contoh Konfigurasi Lanjutan:

      {
      "callbackUrl":"http://oss-demo.aliyuncs.com:23450",
      "callbackHost":"oss-cn-hangzhou.aliyuncs.com",
      "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}",
      "callbackBodyType":"application/x-www-form-urlencoded",
      "callbackSNI":false
      }

      Untuk informasi lebih lanjut tentang bidang-bidang di atas, lihat Bidang yang Didukung oleh Parameter Callback.

  2. (Opsional) Buat Parameter Callback-var

    Parameter ini digunakan untuk mengirimkan informasi layanan kustom, seperti ID pengguna dan nomor pesanan, ke server aplikasi. Parameter ini harus dalam format JSON. Kunci setiap parameter kustom harus dimulai dengan x: dan hanya boleh berisi huruf kecil. Contoh:

    {
      "x:uid": "12345",
      "x:order_id": "67890"
    }

    Parameter callback-var harus digunakan bersama dengan parameter callbackBody. Parameter ID pengguna (uid) dan nomor pesanan (order_id) dalam contoh di atas harus dirujuk oleh placeholder ${x:xxx} dalam callbackBody. Contoh:

    {
      "callbackUrl": "http://oss-demo.aliyuncs.com:23450",
      "callbackBody": "uid=${x:uid}&order=${x:order_id}"
    }

    Selama proses permintaan callback sebenarnya, OSS mengirimkan konten berikut. Dalam contoh ini, bidang callbackBodyType diatur ke application/x-www-form-urlencoded.

    uid=12345&order=67890
  3. Setelah Membuat Parameter Callback dan Callback-var, Anda Harus Mengenkripsi Mereka dalam Base64

    • Contoh: Enkripsi Base64 Parameter Callback

      Parameter callback yang belum dienkripsi Base64:

      {
          "callbackUrl": "http://oss-demo.aliyuncs.com:23450",
          "callbackHost": "your.callback.com",
          "callbackBody": "bucket=${bucket}&object=${object}&uid=${x:uid}&order=${x:order_id}",
          "callbackBodyType": "application/x-www-form-urlencoded",
          "callbackSNI": false
      }

      Parameter callback yang telah dienkripsi Base64:

      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • Contoh: Enkripsi Base64 Parameter Callback-var

      Parameter callback-var yang belum dienkripsi Base64:

      {
        "x:uid": "12345",
        "x:order_id": "67890"
      }

      Parameter callback-var yang telah dienkripsi Base64:

      eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
  4. Tambahkan Parameter yang Telah Dienkripsi Base64 ke dalam Permintaan

    Anda dapat menggunakan salah satu metode berikut untuk menambahkan parameter yang telah dienkripsi Base64 ke dalam permintaan.

    (Direkomendasikan) Tambahkan parameter ke dalam permintaan sebagai header

    Metode ini cocok untuk skenario di mana Anda ingin mengunggah objek ke OSS menggunakan OSS SDKs atau kode backend, yang memberikan keamanan tinggi. Anda dapat mengatur header x-oss-callback ke parameter callback yang telah dienkripsi Base64 dan x-oss-callback-var ke parameter callback-var yang telah dienkripsi Base64. Header x-oss-callback-var ini opsional.

    Catatan: Header x-oss-callback-var dan x-oss-callback termasuk dalam header kanonikal untuk menghitung tanda tangan.

    Contoh

    PUT /your_object HTTP/1.1
    Host: callback-test.oss-test.aliyun-inc.com
    Accept-Encoding: identity
    Content-Length: 5
    x-oss-callback-var: eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
    User-Agent: aliyun-sdk-python/0.4.0 (Linux/2.6.32-220.23.2.ali1089.el5.x86_64/x86_64;2.5.4)
    x-oss-callback: eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    Host: callback-test.oss-test.aliyun-inc.com
    Expect: 100-Continue
    Date: Wed, 26 Apr 2023 03:46:17 GMT
    Content-Type: text/plain
    Authorization: OSS qn6q**************:77Dv****************
    Test

    Tambahkan parameter ke dalam bidang formulir di badan permintaan POST

    Metode ini hanya didukung untuk operasi PostObject. Parameter callback dan callback-var hanya dapat dilewatkan menggunakan bidang formulir di badan permintaan POST.

    • Parameter Callback: Anda harus melewatkan parameter ini sebagai item formulir terpisah dalam format JSON.

      --9431149156168
      Content-Disposition: form-data; name="callback"
      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • Parameter Callback-var: Bidang kustom harus dilewatkan sebagai item formulir terpisah dan tidak dapat dienkapsulasi sebagai bidang callback-var keseluruhan. Bidang formulir ini opsional.

      Contoh parameter uid dan order_id:

      {
        "x:uid": "12345",
        "x:order_id": "67890"
      }

      Ubah parameter uid dan order_id menjadi bidang terpisah dalam formulir:

      --9431149156168
      Content-Disposition: form-data; name="x:uid"
      12345
      --9431149156168
      Content-Disposition: form-data; name="x:order_id"
      67890
    • (Opsional) Verifikasi Parameter Callback: Anda dapat menentukan kondisi verifikasi untuk parameter callback dalam kebijakan. Jika Anda meninggalkan kondisi kosong, parameter callback tidak diverifikasi saat Anda mengunggah objek ke OSS. Contoh:

      { "expiration": "2021-12-01T12:00:00.000Z",
        "conditions": [
          {"bucket": "examplebucket" },
          {"callback": "eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9"},
          ["starts-with", "$key", "user/eric/"],
        ]
      }

    Tambahkan parameter ke dalam URL

    • Metode ini sering digunakan saat Anda mengunggah objek menggunakan URL presigned. Anda dapat mengkodekan ulang parameter callback dan callback-var yang telah dienkripsi Base64 dan menggabungkannya dalam URL untuk mengotomatiskan callback. Namun, informasi callback terpapar dalam URL, yang meningkatkan risiko keamanan. Kami merekomendasikan Anda hanya menggunakannya untuk akses sementara atau dalam skenario sensitivitas rendah.

    • Parameter callback diperlukan, dan parameter callback-var opsional. Selama perhitungan tanda tangan, parameter ini harus digunakan sebagai bagian dari string query kanonikal. Untuk informasi lebih lanjut, lihat (Direkomendasikan) Sertakan Tanda Tangan V4 dalam URL.

      Contoh:

      PUT /your_object?OSSAccessKeyId=LTAI******************&Signature=vjby*************************************&Expires=1682484377&callback-var=eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=&callback=eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 HTTP/1.1
      Host: callback-test.oss-cn-hangzhou.aliyuncs.com
      Date: Wed, 26 Apr 2023 03:46:17 GMT
      Content-Length: 5
      Content-Type: text/plain

Proses permintaan callback pada server aplikasi

Bagian ini menunjukkan cara server aplikasi memproses permintaan callback. Untuk informasi lebih lanjut tentang kode contoh untuk berbagai bahasa pemrograman, lihat Kode Contoh untuk Berbagai Bahasa Pemrograman.

Server aplikasi harus memiliki kemampuan berikut:

  1. Terima Permintaan POST dari OSS

    Setelah objek diunggah, OSS secara otomatis mengirimkan permintaan POST ke server aplikasi berdasarkan parameter callback. Contoh:

    POST /test HTTP/1.1
    Host: your.callback.com
    Connection: close
    Authorization: GevnM3**********3j7AKluzWnubHSVWI4dY3VsIfUHYWnyw==
    Content-MD5: iKU/O/JB***ZMd8Ftg==
    Content-Type: application/x-www-form-urlencoded
    Date: Tue, 07 May 2024 03:06:13 GMT
    User-Agent: aliyun-oss-callback
    x-oss-bucket: your_bucket
    x-oss-pub-key-url: aHR0cHM6Ly9nb3NzcHVi**********vY2FsbGJeV92MS5wZW0=
    x-oss-request-id: 66399AA50*****3334673EC2
    x-oss-requester: 23313******948342006
    x-oss-signature-version: 1.0
    x-oss-tag: CALLBACK
    bucket=your_bucket&object=your_object&uid=12345&order_id=67890
  2. (Opsional) Verifikasi Tanda Tangan Permintaan untuk Memastikan Keamanan Data

    Untuk memastikan bahwa permintaan callback dikirim oleh OSS, kami merekomendasikan Anda memverifikasi tanda tangan permintaan pada server aplikasi. Untuk informasi lebih lanjut, lihat Konfigurasi yang Direkomendasikan.

    Catatan

    Verifikasi tanda tangan tidak wajib. Anda dapat mengaktifkannya berdasarkan kebutuhan bisnis Anda.

  3. Kembalikan Respons untuk Permintaan Callback

    Setelah server aplikasi menerima permintaan callback, ia harus mengembalikan respons ke OSS. Respons tersebut harus memenuhi persyaratan berikut:

    • Secara normal, server aplikasi mengembalikan HTTP/1.1 200 OK.

    • Respons yang dikembalikan oleh server aplikasi ke OSS harus berisi header Content-Length. Ukuran header tidak boleh melebihi 3 MB.

    • Badan respons harus dalam format JSON dan tidak boleh melebihi 1 MB dalam ukuran.

    Dalam contoh ini, server aplikasi mengembalikan {"Status": "OK"}.

    HTTP/1.0 200 OK
    Server: BaseHTTP/0.3 Python/2.7.6
    Date: Mon, 14 Sep 2015 12:37:27 GMT
    Content-Type: application/json
    Content-Length: 9
    {"Status": "OK"}

    OSS mengembalikan respons ke klien. Contoh:

    HTTP/1.1 200 OK
    Date: Mon, 14 Sep 2015 12:37:27 GMT
    Content-Type: application/json
    Content-Length: 9
    Connection: keep-alive
    ETag: "D8E8FCA2DC0F896FD7CB4CB0031BA249"
    Server: AliyunOSS
    x-oss-bucket-version: 1442231779
    x-oss-request-id: 55F6BF87207FB30F2640C548
    {"Status": "OK"}
    Penting

    Untuk permintaan CompleteMultipartUpload, jika badan respons berisi konten seperti informasi dalam format JSON, konten tersebut akan ditimpa oleh respons callback setelah upload callback diaktifkan. Dalam contoh ini, konten tersebut ditimpa oleh {"Status": "OK"}.

Konfigurasi yang direkomendasikan

Verifikasi tanda tangan dalam permintaan callback untuk memastikan keamanan data

Setelah Anda mengonfigurasi parameter callback, OSS mengirimkan permintaan callback ke server aplikasi setelah Anda mengunggah objek ke OSS berdasarkan parameter callbackUrl. Untuk memastikan bahwa permintaan tersebut dikirim oleh OSS, Anda dapat memverifikasi tanda tangan dalam permintaan callback. Langkah-langkah verifikasi:

  1. OSS Menghasilkan Tanda Tangan di Klien

    OSS menggunakan algoritma enkripsi asimetris RSA dan hash MD5 untuk menghasilkan tanda tangan untuk permintaan dan menambahkan tanda tangan ke header permintaan otorisasi.

    • Contoh Kode untuk Perhitungan Tanda Tangan:

      authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))
      Catatan

      Dalam kode di atas, private_key menentukan kunci privat, path menentukan jalur sumber daya yang termasuk dalam permintaan callback, query_string menentukan string query, dan body menentukan badan pesan dalam permintaan callback.

    • Langkah-langkah untuk Menghasilkan Tanda Tangan:

      1. Buat string yang akan ditandatangani. String ini terdiri dari jalur sumber daya yang diperoleh dengan mendekode URL, string query asli, baris baru, dan badan pesan callback.

      2. Tandatangani string yang dibuat menggunakan algoritma enkripsi RSA dan kunci privat. Fungsi hash yang digunakan untuk menghitung tanda tangan adalah MD5.

      3. Gunakan Base64 untuk mengkodekan hasil yang ditandatangani untuk mendapatkan tanda tangan akhir. Kemudian, tambahkan tanda tangan ke header Authorization dalam permintaan callback.

    • Contoh Kode untuk Pembuatan Tanda Tangan:

      POST /index.php?id=1&index=2 HTTP/1.0
      Host: 172.16.XX.XX
      Connection: close
      Content-Length: 18
      authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZj****/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****
      Content-Type: application/x-www-form-urlencoded
      User-Agent: http-client/0.0.1
      x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnsr****
      bucket=examplebucket

      Dalam kode di atas, tanda tangan akhir adalah kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****. Tanda tangan tersebut dihasilkan dari path /index.php, string query ?id=1&index=2, dan body bucket=examplebucket.

  2. Server Aplikasi Memverifikasi Tanda Tangan

    Server aplikasi Anda harus memverifikasi tanda tangan dalam permintaan untuk mengonfirmasi validitas sumber permintaan. Prosedur:

    1. Peroleh Kunci Publik:

      Peroleh URL kunci publik yang dienkripsi Base64 dari header permintaan x-oss-pub-key-url dan dekodekan.

      public_key = urlopen(base64_decode(x-oss-pub-key-url header value))

      URL kunci publik yang dienkripsi Base64:

      aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==

      URL kunci publik yang didekode:

      http://gosspublic.alicdn.com/callback_pub_key_v1.pem
      Catatan

      URL kunci publik harus dimulai dengan http://gosspublic.alicdn.com/ atau https://gosspublic.alicdn.com/. Konten URL kunci publik tetap tidak berubah. Kami merekomendasikan Anda menyimpan cache kunci publik untuk mencegah dampak layanan akibat fluktuasi jaringan.

    2. Dekode Tanda Tangan.

      Peroleh tanda tangan dari header permintaan authorization dan lakukan dekode Base64:

      signature = base64_decode(authorization header value)
    3. Buat String yang Akan Diverifikasi.

      Gabungkan jalur sumber daya, string query, baris baru, dan badan pesan callback dalam format berikut:

      sign_str = url_decode(path) + query_string + '\n' + body
    4. Verifikasi Tanda Tangan.

      Gunakan hash MD5 dan kunci publik RSA untuk memverifikasi tanda tangan:

      result = rsa_verify(public_key, md5(sign_str), signature)
  3. Contoh Verifikasi Tanda Tangan

    Kode berikut memberikan contoh cara server aplikasi memverifikasi tanda tangan. Sebelum menjalankan kode dalam OSS SDK for Python, instal pustaka M2Crypto:

    import httplib
    import base64
    import md5
    import urllib2
    from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
    from M2Crypto import RSA
    from M2Crypto import BIO
    def get_local_ip():
        try:
            csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            csock.connect(('8.8.8.8', 80))
            (addr, port) = csock.getsockname()
            csock.close()
            return addr
        except socket.error:
            return ""
    class MyHTTPRequestHandler(BaseHTTPRequestHandler):
        '''
        def log_message(self, format, *args):
            return
        '''
        def do_POST(self):
            #get public key
            pub_key_url = ''
            try:
                pub_key_url_base64 = self.headers['x-oss-pub-key-url']
                pub_key_url = pub_key_url_base64.decode('base64')
                if not pub_key_url.startswith("http://gosspublic.alicdn.com/") and not pub_key_url.startswith("https://gosspublic.alicdn.com/"):
                    self.send_response(400)
                    self.end_headers()
                    return
                url_reader = urllib2.urlopen(pub_key_url)
                #you can cache it,recommend caching public key content based on the public key address
                pub_key = url_reader.read() 
            except:
                print 'pub_key_url : ' + pub_key_url
                print 'Get pub key failed!'
                self.send_response(400)
                self.end_headers()
                return
            #get authorization
            authorization_base64 = self.headers['authorization']
            authorization = authorization_base64.decode('base64')
            #get callback body
            content_length = self.headers['content-length']
            callback_body = self.rfile.read(int(content_length))
            #compose authorization string
            auth_str = ''
            pos = self.path.find('?')
            if -1 == pos:
                auth_str = urllib2.unquote(self.path) + '\n' + callback_body
            else:
                auth_str = urllib2.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body
            print auth_str
            #verify authorization
            auth_md5 = md5.new(auth_str).digest()
            bio = BIO.MemoryBuffer(pub_key)
            rsa_pub = RSA.load_pub_key_bio(bio)
            try:
                result = rsa_pub.verify(auth_md5, authorization, 'md5')
            except:
                result = False
            if not result:
                print 'Authorization verify failed!'
                print 'Public key : %s' % (pub_key)
                print 'Auth string : %s' % (auth_str)
                self.send_response(400)
                self.end_headers()
                return
            #do something according to callback_body
            #response to OSS
            resp_body = '{"Status":"OK"}'
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.send_header('Content-Length', str(len(resp_body)))
            self.end_headers()
            self.wfile.write(resp_body)
    class MyHTTPServer(HTTPServer):
        def __init__(self, host, port):
            HTTPServer.__init__(self, (host, port), MyHTTPRequestHandler)
    if '__main__' == __name__:
        server_ip = get_local_ip()
    server_port = 23451
    server = MyHTTPServer(server_ip, server_port)
    server.serve_forever()

    Tabel berikut menjelaskan kode yang dapat Anda gunakan untuk memverifikasi tanda tangan pada server dalam bahasa pemrograman lainnya.

    SDK bahasa pemrograman

    Deskripsi

    Java

    • Tautan unduhan: OSS SDK for Java

    • Cara menjalankan: Ekstrak paket dan jalankan java -jar oss-callback-server-demo.jar 9000. Anda dapat mengganti 9000 dengan nomor port yang berbeda.

    Python

    • Tautan unduhan: OSS SDK for Python

    • Cara menjalankan: Ekstrak paket dan jalankan python callback_app_server.py. Dependensi RSA diperlukan untuk menjalankan kode tersebut.

    PHP

    • Tautan unduhan: OSS SDK for PHP

    • Cara menjalankan: Terapkan kode ke lingkungan Apache untuk memastikan bahwa header tertentu dalam kode dapat menggunakan lingkungan sebagai dependensi. Anda dapat memodifikasi kode contoh berdasarkan lingkungan.

    .NET

    • Tautan unduhan: OSS SDK for .NET

    • Cara menjalankan: Ekstrak paket dan ikuti petunjuk dalam README.md.

    Node.js

    • Tautan unduhan: OSS SDK for Node.js

    • Cara menjalankan: Ekstrak paket dan jalankan node example.js.

    Ruby

    • Tautan unduhan: OSS SDK for Ruby

    • Cara menjalankan: Jalankan ruby aliyun_oss_callback_server.rb.

Bidang yang didukung oleh parameter callback

Tabel berikut menjelaskan bidang yang didukung oleh parameter callback. Bidang-bidang ini digunakan untuk mengonfigurasi konten dan perilaku permintaan callback setelah objek diunggah ke OSS.

Bidang

Diperlukan

Deskripsi

callbackUrl

Ya

URL server aplikasi ke mana OSS mengirimkan permintaan callback.

  • Anda dapat menentukan hingga lima URL dalam permintaan callback. Anda harus memisahkan URL dengan titik koma (;). OSS mengirimkan permintaan callback ke setiap URL sampai respons sukses dikembalikan.

  • URL mendukung protokol HTTPS.

  • Anda tidak dapat memasukkan alamat IPv6 atau nama domain yang menunjuk ke alamat IPv6.

  • Untuk memastikan bahwa karakter Cina dapat diproses dengan benar, Anda harus mengenkripsi URL callback.

callbackBody

Ya

Badan permintaan callback. Format badan permintaan harus sesuai dengan bidang callbackType.

  • Saat bidang callbackType diatur ke nilai default application/x-www-form-urlencoded, bidang callbackBody harus dalam format key-value. Contoh: bucket=${bucket}&object=${object}&my_var_1=${x:my_var1}&my_var_2=${x:my_var2}.

  • Saat bidang callbackType diatur ke application/json, bidang callbackBody harus dalam format JSON. Contoh: {\"bucket\":${bucket},\"object\":${object},\"mimeType\":${mimeType},\"size\":${size},\"my_var1\":${x:my_var1},\"my_var2\":${x:my_var2}}.

Bidang callbackBody mendukung parameter sistem OSS, parameter kustom, dan konstanta. Untuk informasi lebih lanjut tentang variabel sistem, lihat Variabel sistem yang didukung oleh callbackBody.

callbackHost

Tidak

Nilai header Host dalam permintaan callback. Nilai tersebut harus berupa nama domain atau alamat IP.

  • Jika Anda tidak mengonfigurasi bidang callbackHost, nilai host akan diselesaikan dari URL dalam bidang callbackUrl dan ditentukan sebagai nilai bidang callbackHost.

callbackSNI

Tidak

Menentukan apakah akan menentukan Server Name Indication (SNI) dalam permintaan callback.

Jika parameter callbackUrl menggunakan HTTPS, kami merekomendasikan Anda mengaktifkan parameter ini. Jika tidak, callback mungkin gagal karena ketidakcocokan sertifikat. Misalnya, "502 callback failed" dikembalikan. Nilai valid:

  • true

  • false (default)

    Catatan

    Saat permintaan callback diinisiasi di wilayah London, Inggris, SNI dikirim terlepas dari nilai callbackSNI.

callbackBodyType

Tidak

Nilai Content-Type dalam permintaan callback, yaitu format data callbackBody.

Nilai valid:

  • application/x-www-form-urlencoded (default)

    Jika Anda mengatur bidang callbackBodyType ke application/x-www-form-urlencoded, parameter dalam bidang callbackBody diganti dengan nilai yang dienkripsi URL.

  • application/json

    Jika Anda mengatur bidang callbackBodyType ke application/json, parameter dalam bidang callbackBody diganti dengan nilai dalam format JSON.

Variabel sistem yang didukung oleh callbackBody

Bidang callbackBody dalam parameter callback memungkinkan Anda menggunakan beberapa parameter sistem untuk melewati informasi tentang objek yang diunggah dalam permintaan callback. Tabel berikut menjelaskan parameter sistem yang didukung.

Parameter sistem

Deskripsi

bucket

Nama bucket.

object

Jalur lengkap objek.

etag

Bidang ETag objek. ETag dikembalikan ke peminta.

size

Ukuran objek. Ukuran tersebut adalah ukuran seluruh objek saat Anda memanggil operasi CompleteMultipartUpload.

mimeType

Jenis sumber daya. Misalnya, jenis sumber daya gambar JPEG adalah image/jpeg.

imageInfo.height

Tinggi gambar. Parameter ini hanya berlaku untuk objek gambar. Untuk objek lainnya, parameter ini dibiarkan kosong.

imageInfo.width

Lebar gambar. Parameter ini hanya berlaku untuk objek gambar. Untuk objek lainnya, parameter ini dibiarkan kosong.

imageInfo.format

Format gambar. Contoh: JPG dan PNG. Parameter ini hanya berlaku untuk objek gambar. Untuk objek lainnya, parameter ini dibiarkan kosong.

crc64

Nilai CRC64. Nilai parameter ini sama dengan header x-oss-hash-crc64ecma yang dikembalikan setelah objek diunggah.

contentMd5

Nilai MD5. Nilai parameter ini sama dengan header Content-MD5 yang dikembalikan setelah objek diunggah.

Penting

Parameter ini hanya diperlukan jika Anda memanggil operasi PutObject atau PostObject untuk mengunggah objek.

vpcId

ID virtual private cloud (VPC) tempat klien yang memulai permintaan berada. Jika permintaan tidak dimulai melalui VPC, parameter ini dibiarkan kosong.

clientIp

Alamat IP klien yang memulai permintaan.

reqId

ID permintaan yang dimulai.

operation

Operasi API yang digunakan untuk memulai permintaan, seperti PutObject dan PostObject.

SDK

Tabel berikut menjelaskan OSS SDK yang dapat Anda gunakan untuk mengonfigurasi callback.

Unggah sederhana

(PutObject)

Unggah multipart

(CompleteMultipartUpload)

Unggah berbasis URL presigned

(PutObject)

Java

demo

demo

demo

Python V2

demo

-

demo

Go V2

demo

demo

demo

Pemecahan Masalah

Jika terjadi kesalahan selama proses callback, pesan kesalahan yang berisi kode kesalahan akan dikembalikan oleh OSS. Anda dapat menggunakan kode kesalahan tersebut untuk pemecahan masalah. Setiap kode kesalahan sesuai dengan penyebab kesalahan tertentu. Untuk informasi tentang kode kesalahan terkait callback, lihat 07-CALLBACK.

FAQ

Apakah OSS mengirimkan permintaan callback ke server aplikasi saat objek gagal diunggah?

Tidak. OSS hanya mengirimkan permintaan callback ke server aplikasi jika objek berhasil diunggah. Jika objek gagal diunggah, OSS tidak mengirimkan permintaan callback ke server aplikasi tetapi mengembalikan pesan kesalahan.

Apa yang harus saya lakukan jika pesan kesalahan "Response body is not valid json format" dikembalikan?

  • Pesan kesalahan ini dikembalikan karena server aplikasi melempar pengecualian saat permintaan sedang diproses. Dalam hal ini, badan respons yang dikembalikan ke OSS tidak dalam format JSON. Gambar berikut menunjukkan respons yang dikembalikan ke OSS saat kesalahan ini terjadi.callback

    Solusi:

    • Jalankan perintah berikut untuk mengonfirmasi konten:

      curl -d "<Content>" <CallbackServerURL> -v
    • Tangkap paket untuk mengonfirmasi konten.

      Kami merekomendasikan Anda menggunakan alat Wireshark di Windows atau menjalankan perintah tcpdump di Linux untuk menangkap paket.

  • Badan respons yang dikembalikan oleh server aplikasi ke OSS mencakup header BOM.

    Kesalahan ini umum terjadi di antara server aplikasi yang ditulis menggunakan OSS SDK for PHP. OSS SDK for PHP mengembalikan header BOM. Akibatnya, OSS menerima tiga byte tambahan dalam badan respons yang tidak dalam format JSON. Gambar berikut menunjukkan bahwa byte ef, bb, dan bf adalah byte tambahan dalam badan respons.

    callback1

    Solusi: Hapus header BOM dari badan respons yang dikembalikan oleh server aplikasi ke OSS.