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: 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: |
Date | Diperlukan. Waktu saat permintaan dikirim. Tentukan waktu dalam standar ISO 8601 dalam format YYYY-MM-DDThh:mm:ssZ. Waktu harus dalam UTC. Contoh: |
CanonicalizedOpenSearchHeaders | Diperlukan. Header HTTP spesifik OpenSearch yang digunakan untuk membedakan antara permintaan. Semua header permintaan HTTP yang diawali dengan |
CanonicalizedResource | Diperlukan. Jalur permintaan. Contoh: |
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.
Tentukan nilai header HTTP spesifik OpenSearch yang diawali dengan
X-Opensearch-. Contohnya, header lengkap adalahX-Opensearch-Nonce : 155108**********. Nilai header, seperti155108**********, terdiri dari timestamp 10 digit dan nilai acak 6 digit antara 100000 hingga 999999. Hilangkan semua header HTTP spesifik OpenSearch yang nilainya kosong.Urutkan semua header HTTP spesifik OpenSearch yang tersisa secara alfabetis.
Ubah huruf besar dalam nama header HTTP yang diurutkan menjadi huruf kecil. Misalnya, ubah
X-Opensearch-Nonce : 155108**********menjadix-opensearch-nonce : 155108**********.Hapus semua spasi di setiap sisi pemisah antara header dan nilainya. Contohnya, header asli adalah
x-opensearch-nonce : 155108**********. Setelah penghapusan spasi, hasilnya menjadix-opensearch-nonce:155108**********.Anggap setiap pasangan header-nilai sebagai item. Hubungkan semua item dengan pemisah
\nuntuk membentuk string CanonicalizedOpenSearchHeaders akhir. Pemisah\njuga harus ditambahkan ke item terakhir.
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.
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:
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.
Urutkan parameter permintaan secara alfabetis berdasarkan
keylalu berdasarkanvalue.Encode
keysdanvaluesparameter permintaan sesuai standar RFC 3986. Lalu, gabungkan kunci dan nilai setiap parameter yang telah diencode menggunakan tanda sama dengan (=).Gabungkan parameter permintaan yang telah diencode menggunakan ampersand (
&) dan simpan hasilnya sebagai string kueri.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
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': ' | 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: |
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.
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
}
}