全部产品
Search
文档中心

OpenSearch:Metode tanda tangan API OpenSearch V3

更新时间:Jun 26, 2025

Topik ini menjelaskan metode tanda tangan API OpenSearch V3 dan cara menggunakan API tersebut.

OpenSearch mengotentikasi setiap permintaan akses dengan menerapkan enkripsi simetris berdasarkan pasangan AccessKey untuk memverifikasi identitas pengguna. Setiap pasangan AccessKey terdiri dari ID AccessKey dan Rahasia AccessKey.

ID AccessKey dan Rahasia AccessKey diterbitkan secara resmi oleh Alibaba Cloud kepada pengguna. Anda dapat meminta dan mengelola pasangan AccessKey di situs internasional Alibaba Cloud (alibabacloud.com). ID AccessKey digunakan untuk memverifikasi identitas pengguna.

Rahasia AccessKey digunakan untuk mengenkripsi string tanda tangan dan memverifikasi string tanda tangan di server. Pastikan Anda menjaga kerahasiaan Rahasia AccessKey.

Aplikasi yang didukung

  • Aplikasi tingkat lanjut

  • Aplikasi standar

Protokol

API OpenSearch V3 hanya mendukung protokol HTTP.

Metode permintaan

  • Gunakan permintaan HTTP GET untuk mencari data.

  • Gunakan permintaan HTTP POST untuk mendorong data.

Menghitung nilai header Authorization

Tambahkan string tanda tangan ke header Authorization dalam permintaan HTTP untuk menunjukkan bahwa permintaan telah diautentikasi. Permintaan HTTP juga harus mencakup header lain yang diperlukan. Bagian "Contoh" dalam topik ini memberikan contoh header.

Semua header permintaan, seperti Content-MD5, Content-Type, Date, dan header HTTP spesifik OpenSearch, harus digunakan untuk perhitungan tanda tangan. Tambahkan spasi setelah OPENSEARCH dalam "Authorization:OPENSEARCH " pada string-to-sign berikut:

"Authorization: OPENSEARCH " + AccessKeyId + ":" + Signature
Signature = base64(hmac-sha1(AccessKeySecret,
            VERB + "\n"
            + Content-Md5 + "\n"
            + Content-Type + "\n"
            + Date + "\n"
            + CanonicalizedOpenSearchHeaders
            + CanonicalizedResource))

Hitung nilai HMAC dari string-to-sign sesuai RFC 2104

  • Gunakan metode HMAC-SHA1 yang didefinisikan dalam RFC 2104 untuk menghitung string tanda tangan.

  • String tanda tangan harus dikodekan dalam UTF-8.

  • Untuk string tanda tangan yang berisi karakter Cina, kodekan terlebih dahulu dalam UTF-8. String tanda tangan yang telah dikodekan digunakan bersama dengan parameter AccessKeySecret untuk menghitung string tanda tangan akhir.

  • Urutkan parameter yang digunakan untuk menghitung string tanda tangan sesuai urutan dalam kode sampel sebelumnya.

Parameter

Deskripsi

AccessKeyId

Diperlukan. ID AccessKey dari pengguna yang mengirim permintaan. Parameter ini harus ditentukan untuk header Authorization.

AccessKeySecret

Diperlukan. Rahasia AccessKey dari pengguna yang mengirim permintaan. Rahasia AccessKey digunakan untuk mengenkripsi dan memverifikasi string tanda tangan.

VERB

Diperlukan. Metode permintaan. Metode yang didukung untuk permintaan HTTP meliputi PUT, GET, POST, HEAD, dan DELETE. Metode permintaan yang berbeda diperlukan oleh operasi API yang berbeda.

\n

Baris baru.

Content-MD5

Nilai MD5 dari badan permintaan HTTP. Parameter ini diperlukan jika permintaan memiliki badan. Parameter ini digunakan untuk memeriksa apakah konten permintaan yang diterima sama dengan permintaan yang dikirim. Ini memastikan validitas permintaan. Contoh: 4991ef0788236a8f280fed0db928e74e.

Untuk permintaan yang tidak memiliki badan, seperti permintaan untuk mencari data, jangan tentukan parameter ini. Untuk informasi lebih lanjut, lihat RFC 2616 Content-MD5.

Content-Type

Contoh: application/json.

Date

Diperlukan. Waktu saat permintaan dikirim. Tentukan waktu dalam standar ISO 8601 dalam format YYYY-MM-DDThh:mm:ssZ. Waktu harus dalam UTC. Contoh: 2019-02-25T10:09:57Z. Jika interval antara waktu permintaan dikirim dan waktu server OpenSearch menerima permintaan melebihi 15 menit, server akan menolak permintaan dan mengembalikan kode kesalahan HTTP 403.

CanonicalizedOpenSearchHeaders

Diperlukan. Header HTTP spesifik OpenSearch yang digunakan untuk membedakan antara permintaan. Semua header permintaan HTTP yang diawali dengan X-Opensearch-, seperti X-Opensearch-Nonce, adalah header HTTP spesifik OpenSearch. Selama perhitungan tanda tangan, nama header ini harus dalam huruf kecil, seperti x-opensearch-nonce. Jika header ini digunakan sebagai header permintaan, tentukan nama header dalam format aslinya. Jika header ini tidak digunakan sebagai header permintaan, mereka tidak digunakan untuk perhitungan tanda tangan. Dalam hal ini, hapus parameter CanonicalizedOpenSearchHeaders dari string-to-sign.

CanonicalizedResource

Diperlukan. Jalur permintaan. Contoh: /v3/openapi/apps/app_schema_demo/search?fetch_fields=name&query=query%3Dname%3A%27%E6%96%87%E6%A1%A3%27%26%26sort%3Did%26%26config%3Dformat%3Afulljson.

Permintaan untuk mencari data

Parameter tanda tangan permintaan

Diperlukan

Header permintaan

Diperlukan

AccessKeySecret

Ya

Date

Ya

VERB

Ya

X-Opensearch-Nonce

Ya

Date

Ya

Authorization

Ya

x-opensearch-nonce

Ya

canonicalized_resource

Ya

  • Nilai header permintaan harus sesuai dengan yang ditentukan untuk perhitungan tanda tangan.

  • Disarankan untuk menambahkan parameter Content-MD5, Content-Type, Date, CanonicalizedOpenSearchHeaders, dan Authorization sebagai header permintaan. Jika hanya menentukan header yang diperlukan, kesalahan mungkin terjadi.

  • Gunakan semua header permintaan untuk perhitungan tanda tangan.

Permintaan untuk mendorong data

Parameter tanda tangan permintaan

Diperlukan

Header permintaan

Diperlukan

AccessKeySecret

Ya

Content-MD5

Ya

VERB

Ya

Date

Ya

Content-MD5

Ya

Authorization

Ya

Date

Ya

canonicalized_resource

Ya

  • Nilai header permintaan harus sesuai dengan yang ditentukan untuk perhitungan tanda tangan.

  • Disarankan untuk menambahkan parameter Content-MD5, Content-Type, Date, CanonicalizedOpenSearchHeaders, dan Authorization sebagai header permintaan. Jika hanya menentukan header yang diperlukan, kesalahan mungkin terjadi.

  • Gunakan semua header permintaan untuk perhitungan tanda tangan.

Membuat string CanonicalizedOpenSearchHeaders

Parameter CanonicalizedOpenSearchHeaders mencakup semua header HTTP spesifik OpenSearch yang diawali dengan X-Opensearch-. Header HTTP lain tidak termasuk dalam bagian ini.

  1. Tentukan nilai header HTTP spesifik OpenSearch yang diawali dengan X-Opensearch-. Contohnya, header lengkap adalah X-Opensearch-Nonce : 155108**********. Nilai header, seperti 155108**********, terdiri dari timestamp 10 digit dan nilai acak 6 digit antara 100000 hingga 999999. Hilangkan semua header HTTP spesifik OpenSearch yang nilainya kosong.

  2. Urutkan semua header HTTP spesifik OpenSearch yang tersisa secara alfabetis.

  3. Ubah huruf besar dalam nama header HTTP yang diurutkan menjadi huruf kecil. Misalnya, ubah X-Opensearch-Nonce : 155108********** menjadi x-opensearch-nonce : 155108**********.

  4. Hapus semua spasi di setiap sisi pemisah antara header dan nilainya. Contohnya, header asli adalah x-opensearch-nonce : 155108**********. Setelah penghapusan spasi, hasilnya menjadi x-opensearch-nonce:155108**********.

  5. Anggap setiap pasangan header-nilai sebagai item. Hubungkan semua item dengan pemisah \n untuk membentuk string CanonicalizedOpenSearchHeaders akhir. Pemisah \n juga harus ditambahkan ke item terakhir.

Catatan
  1. Permintaan HTTP untuk mencari data mungkin tidak mencakup header HTTP spesifik OpenSearch. Header ini tidak digunakan untuk perhitungan tanda tangan. Dalam hal ini, pemisah "\n" tidak diperlukan dan Anda tidak perlu membuat string CanonicalizedOpenSearchHeaders. Hapus parameter CanonicalizedOpenSearchHeaders dari string-to-sign.

  2. Saat menambahkan header HTTP spesifik OpenSearch ke header permintaan, jangan gunakan format huruf kecil. Gunakan format aslinya.

Membuat String CanonicalizedResource

  • String tanda tangan harus dikodekan dalam UTF-8. Untuk string tanda tangan yang berisi karakter Cina, kodekan terlebih dahulu dalam UTF-8. String tanda tangan yang telah dikodekan digunakan bersama dengan parameter AccessKeySecret untuk menghitung string tanda tangan akhir.

  • String CanonicalizedResource untuk permintaan pencarian data berada dalam format: path + ? + query.

  • String CanonicalizedResource untuk permintaan untuk mendorong data berada dalam format berikut: path.

Membuat String Jalur

Untuk membuat string jalur, encode string asli, ganti %2F dengan garis miring (/), lalu ganti app_schema_demo dengan nama aplikasi Anda. Berikut adalah empat string jalur umum:

  • String jalur untuk permintaan pencarian data: /v3/openapi/apps/app_schema_demo/search.

  • String jalur untuk permintaan pencarian data berdasarkan saran: /v3/openapi/suggestions/suggestion_name/actions/search.

  • String jalur untuk permintaan pencarian data menggunakan aplikasi: /v3/openapi/apps/appid. Ganti appid dengan ID aplikasi Anda yang digunakan untuk pencarian dan tentukan header Authorization untuk otentikasi. Parameter permintaan tidak diperlukan.

  • String jalur untuk permintaan mendorong data: /v3/openapi/apps/app_schema_demo/tab/actions/bulk. Ganti tab dengan nama tabel yang digunakan untuk menerima data dalam aplikasi Anda.

Membuat string kueri

String kueri terdiri dari parameter permintaan dalam bentuk pasangan kunci-nilai. Untuk membuat string kueri untuk string CanonicalizedResource, ikuti langkah-langkah berikut:

  1. Tetapkan nilai untuk setiap parameter permintaan yang akan digunakan dan hilangkan parameter dengan nilai kosong. Parameter dengan nilai kosong tidak digunakan untuk perhitungan tanda tangan.

  2. Urutkan parameter permintaan secara alfabetis berdasarkan key lalu berdasarkan value.

  3. Encode keys dan values parameter permintaan sesuai standar RFC 3986. Lalu, gabungkan kunci dan nilai setiap parameter yang telah diencode menggunakan tanda sama dengan (=).

  4. Gabungkan parameter permintaan yang telah diencode menggunakan ampersand (&) dan simpan hasilnya sebagai string kueri.

  5. Gabungkan string jalur dan string kueri untuk membentuk string CanonicalizedResource akhir dalam format: path + ? + query. Contoh string CanonicalizedResource: /v3/openapi/apps/app_schema_demo/search?fetch_fields=name&query=query%3Dname%3A%27%E6%96%87%E6%A1%A3%27%26%26sort%3Did%26%26config%3Dformat%3Afulljson.

    • Contoh string CanonicalizedResource mencakup parameter permintaan dan nilainya berikut:

      • fetch_fields=name

    • Contoh string CanonicalizedResource mencakup parameter kueri dan klausa berikut. Bagian pertama menunjukkan parameter kueri dan bagian kedua menunjukkan klausa kueri serta klausa relevan lainnya.

      • query=query=name:'document'&&sort=id&&config=format:fulljson

Catatan

Sebelum mengkodekan string untuk parameter kueri, gabungkan klausa dengan dua ampersand (&&). Jika ingin mengirim permintaan untuk mendorong data, cukup gunakan string jalur sebagai string CanonicalizedResource.

Membuat header Authorization

Untuk informasi tentang cara membuat header Authorization, lihat bagian "Menghitung nilai header Authorization" dalam topik ini. Misalnya, ID AccessKey pengguna adalah LTAI**************** dan string tanda tangan adalah 1P7tfE****. Kode Python 3 sampel berikut membuat header Authorization:

headers['Authorization'] = 'OPENSEARCH ' + 'LTAI****************' + ':' + '1P7tfE****'

Contoh

Misalnya, header dan parameter permintaan serta metode permintaan dikonfigurasi sebagai berikut:

  • Authorization: OPENSEARCH LTAI****************:1P7tfE****.

  • AccessKeySecret: yourAccessKeySecret.

  • Metode permintaan: GET.

  • Content-MD5: Parameter ini dibiarkan kosong karena permintaan sampel digunakan untuk mencari data.

  • Content-Type: application/json.

  • Date: 2019-02-25T10:09:57Z.

  • CanonicalizedOpenSearchHeaders: x-opensearch-nonce:15510****1704.

  • CanonicalizedResource: /v3/openapi/apps/app_schema_demo/search?fetch_fields=name&query=query%3Dname%3A%27%E6%96%87%E6%A1%A3%27%26%26sort%3Did%26%26config%3Dformat%3Afulljson.

Header permintaan

Rumus perhitungan string tanda tangan

Contoh

'Content-MD5': '','Content-Type': 'application/json','Authorization': 'OPENSEARCH LTAI****************:1P7tfE****','X-Opensearch-Nonce': '155108**********','Date': '2019-02-25T10:09:57Z'

Signature = base64(hmac-sha1(AccessKeySecret,VERB + "\n"+ Content-Md5 + "\n"+ Content-Type + "\n"+ Date + "\n"+ CanonicalizedOpenSearchHeaders+ CanonicalizedResource))

yourAccessKeySecret,GET\n\napplication/json\n2019-02-25T10:09:57Z\nx-opensearch-nonce:155108**********\n/v3/openapi/apps/app_schema_demo/search?fetch_fields=name&query=query%3Dname%3A%27%E6%96%87%E6%A1%A3%27%26%26sort%3Did%26%26config%3Dformat%3Afulljson

Catatan

Nilai header permintaan harus sesuai dengan yang ditentukan untuk perhitungan tanda tangan.

Contoh Perhitungan String Tanda Tangan

  • Dalam contoh ini, nilai HMAC dan format pengkodean Base64 digunakan untuk menghitung string tanda tangan.

Kode Python 3 sampel:

import hmac
import base64
signature_string = '\n'.join(['GET',
                              '',
                              'application/json',
                              '2019-02-25T10:09:57Z',
                              'x-opensearch-nonce:1551089397451704',
                              '/v3/openapi/apps/app_schema_demo/search?fetch_fields=name&query=query%3Dname%3A%27%E6%96%87%E6%A1%A3%27%26%26sort%3Did%26%26config%3Dformat%3Afulljson'])
signature_hmac = hmac.new('yourAccessKeySecret'.encode('utf-8'), signature_string.encode('utf-8'), 'sha1')
signature = base64.b64encode(signature_hmac.digest())

Misalnya, Rahasia AccessKey pengguna adalah yourAccessKeySecret. String tanda tangan akhir yang dihitung menggunakan metode perhitungan sebelumnya adalah 1P7tfE****.

Membuat string permintaan

String permintaan berada dalam format berikut: host + string CanonicalizedResource.

Tambahkan string tanda tangan ke header Authorization dalam permintaan HTTP untuk menunjukkan bahwa permintaan telah diautentikasi. Permintaan HTTP juga harus mencakup header lain yang diperlukan yang dijelaskan dalam bagian sebelumnya. Dalam string permintaan, host menentukan titik akhir API OpenSearch.

  • String permintaan untuk permintaan pencarian data: http://host/v3/openapi/apps/app_schema_demo/search?fetch_fields=name&query=query%3Dname%3A%27%E6%96%87%E6%A1%A3%27%26%26sort%3Did%26%26config%3Dformat%3Afulljson.

  • String permintaan untuk permintaan pencarian data berdasarkan saran: http://host/v3/openapi/apps/{appName}/suggest/{suggestName}/search?hits=10&query=%E6%A0%87%E9%A2%98.

  • String permintaan untuk permintaan pencarian data menggunakan aplikasi: http://host/v3/openapi/apps/120001234. Ganti appid dengan ID aplikasi Anda, seperti 120001234, yang digunakan untuk pencarian, dan tentukan header Authorization untuk otentikasi. Parameter permintaan tidak diperlukan.

  • String permintaan untuk permintaan mendorong data: http://host/v3/openapi/apps/app_schema_demo/tab/actions/bulk. Data yang akan didorong harus ditentukan dalam badan permintaan.

Catatan

  • OpenSearch menyediakan SDK untuk Java, PHP, Python, dan C# berdasarkan API OpenSearch V3. SDK untuk PHP, Python, dan C# telah mengimplementasikan metode API OpenSearch V3 untuk menghitung tanda tangan. Anda dapat langsung menggunakan metode ini atau merujuk pada kode sumber untuk implementasi dalam bahasa lain.

  • OpenSearch tidak memelihara SDK yang diimplementasikan berdasarkan topik ini dan kode sumber SDK resmi. Pengguna harus memelihara SDK ini sendiri.

Template skema aplikasi

{
  "name": "app_schema_demo",
  "type": "standard",
  "schema": {
    "indexes": {
      "search_fields": {
        "id": {
          "fields": [
            "id"
          ]
        },
        "name": {
          "fields": [
            "name"
          ],
          "analyzer": "chn_standard"
        },
        "phone": {
          "fields": [
            "phone"
          ],
          "analyzer": "fuzzy"
        },
        "int_arr": {
          "fields": [
            "int_arr"
          ]
        },
        "literal_arr": {
          "fields": [
            "literal_arr"
          ]
        },
        "cate_id": {
          "fields": [
            "cate_id"
          ]
        }
      },
      "filter_fields": [
        "id",
        "int_arr",
        "literal_arr",
        "float_arr",
        "cate_id"
      ]
    },
    "tables": {
      "tab": {
        "name": "tab",
        "fields": {
          "id": {
            "name": "id",
            "type": "INT",
            "primary_key": true
          },
          "name": {
            "name": "name",
            "type": "TEXT",
            "primary_key": false
          },
          "phone": {
            "name": "phone",
            "type": "SHORT_TEXT",
            "primary_key": false
          },
          "int_arr": {
            "name": "int_arr",
            "type": "INT_ARRAY",
            "primary_key": false
          },
          "literal_arr": {
            "name": "literal_arr",
            "type": "LITERAL_ARRAY",
            "primary_key": false
          },
          "float_arr": {
            "name": "float_arr",
            "type": "FLOAT_ARRAY",
            "primary_key": false
          },
          "cate_id": {
            "name": "cate_id",
            "type": "INT",
            "primary_key": false
          }
        },
        "primary_table": true
      }
    },
    "route_field": null
  },
  "data_sources": [],
  "first_ranks": {},
  "second_ranks": {},
  "summary": [],
  "fetch_fields": [
    "id",
    "name",
    "phone",
    "int_arr",
    "literal_arr",
    "float_arr",
    "cate_id"
  ],
  "quota": {
    "qps": 6,
    "doc_size": 0.3
  }
}