All Products
Search
Document Center

API Gateway:Autentikasi dan otorisasi konsumen

Last Updated:Jun 09, 2026

API Gateway berbasis cloud mendukung autentikasi global, autentikasi tingkat rute, dan otorisasi konsumen. Topik ini menjelaskan cara mengonfigurasi setiap metode autentikasi serta memberikan otorisasi kepada konsumen untuk mengakses rute dan API tertentu.

Latar belakang

Autentikasi global cocok untuk skenario B2C seperti logon terpadu. Autentikasi konsumen untuk rute dan API cocok untuk skenario B2B seperti pemberian akses API kepada mitra.

Item

Autentikasi global

Autentikasi rute dan otorisasi konsumen

Kasus penggunaan

Skema B2C, seperti autentikasi logon terpadu.

Skema B2B, seperti pemberian akses API kepada mitra.

Perbedaan utama

Otorisasi diaktifkan secara otomatis saat autentikasi diaktifkan.

Setelah Anda mengaktifkan autentikasi, Anda harus mengonfigurasi otorisasi secara terpisah.

Jalur konfigurasi

Instance > Security Management > Global Authentication.

  1. API Management > HTTP API Details > Route Management > Policy Configuration > Consumer Authentication.

  2. API Management > WebSocket API Details > Route Management > Policy Configuration > Consumer Authentication.

  3. API Management > REST API Details > Attach Policy > Consumer Authentication.

  4. Consumers > Consumer Details > Consumer Authorization.

Konfigurasi metode autentikasi (contoh autentikasi JWT)

  1. Saat membuat konfigurasi, berikan konfigurasi JWKS global.

  2. Masukkan bidang issue dan sub untuk memverifikasi JWT.

  1. Saat membuat konfigurasi konsumen, berikan konfigurasi JWKS yang sesuai untuk konsumen tersebut.

  2. Berikan identifikasi konsumen untuk memverifikasi bahwa JWT tersebut milik konsumen yang benar. Secara default, ini adalah bidang uid dalam payload, tetapi Anda dapat menyesuaikannya.

Konfigurasi metode otorisasi

Saat membuat konfigurasi, berikan daftar Domain Name dan Path untuk blacklist atau whitelist.

  • Blacklist Mode: Permintaan ke Domain Name dan Path dalam daftar memerlukan autentikasi. Semua permintaan lain tidak memerlukannya.

  • Whitelist Mode: Permintaan ke domain dan Path dalam daftar tidak memerlukan autentikasi. Semua permintaan lain harus diautentikasi.

  1. Dalam pengaturan Configure Policy untuk rute atau API, aktifkan Authentication.

  2. Dalam Consumer Authorization, berikan akses konsumen ke rute atau API yang telah diautentikasi untuk menyelesaikan proses otorisasi.

Catatan penggunaan

Setelah Anda mengaktifkan autentikasi konsumen, kebijakan tersebut langsung berlaku. Jika tidak ada konsumen atau aturan otorisasi yang dikonfigurasi untuk rute atau API yang dipublikasikan, gateway akan menolak semua permintaan secara default.

Gunakan autentikasi dan otorisasi konsumen

Autentikasi JWT

Alur kerja autentikasi JWT

  1. Klien mengirim permintaan autentikasi ke gateway, biasanya dengan username dan password pengguna akhir.

  2. Gateway meneruskan permintaan tersebut ke layanan backend.

  3. Backend memvalidasi kredensial tersebut. Setelah validasi berhasil, layanan tersebut menghasilkan token dengan kunci privat dan mengembalikan token tersebut ke gateway.

  4. Gateway mengembalikan token tersebut ke klien. Klien menyimpan cache token ini secara lokal.

  5. Klien mengirim permintaan bisnis dengan token yang disimpan ke gateway.

  6. Gateway memverifikasi token menggunakan kunci publik yang dikonfigurasi. Jika valid, gateway meneruskan permintaan ke backend.

  7. Backend memproses permintaan dan mengembalikan respons.

  8. Gateway meneruskan respons tersebut ke klien.

Bagian berikut menjelaskan cara menghasilkan token, mengirim permintaan ke gateway, dan memvalidasi token menggunakan kunci publik yang dikonfigurasi.

Hasilkan token

Contoh Java berikut menunjukkan cara menghasilkan token. Anda dapat menggunakan alat serupa dalam bahasa pemrograman lain.

  1. Buat proyek Maven dan tambahkan dependensi.

    Tambahkan dependensi berikut ke proyek:

    <dependency>
        <groupId>org.bitbucket.b_c</groupId>
        <artifactId>jose4j</artifactId>
        <version>0.7.0</version>
    </dependency>
  2. Pilih metode untuk menghasilkan token.

    Anda dapat menghasilkan token menggunakan kunci simetris atau asimetris.

    Kunci simetris

    Kode contoh:

    package org.example;
    
    import java.io.UnsupportedEncodingException;
    import java.security.PrivateKey;
    
    import org.jose4j.base64url.Base64;
    import org.jose4j.json.JsonUtil;
    import org.jose4j.jwk.OctJwkGenerator;
    import org.jose4j.jwk.OctetSequenceJsonWebKey;
    import org.jose4j.jws.AlgorithmIdentifiers;
    import org.jose4j.jws.JsonWebSignature;
    import org.jose4j.jwt.JwtClaims;
    import org.jose4j.jwt.NumericDate;
    import org.jose4j.keys.HmacKey;
    import org.jose4j.lang.JoseException;
    import sun.lwawt.macosx.CSystemTray;
    
    public class Main {
        public static void main(String[] args) throws JoseException, UnsupportedEncodingException {
            // Gunakan contoh dari topik ini.
            String privateKeyJson = "{\n"
                    + "    \"k\": \"VoBG-oyqVoyCr9G56ozmq8n_rlDDyYMQOd_DO4GOkEY\",\n"
                    + "    \"kty\": \"oct\",\n"
                    + "    \"alg\": \"HS256\",\n"
                    + "}";
            JwtClaims claims = new JwtClaims();
            claims.setGeneratedJwtId();
            claims.setIssuedAtToNow();
            // Atur waktu kedaluwarsa kurang dari 7 hari.
            NumericDate date = NumericDate.now();
            date.addSeconds(120*60);
            claims.setExpirationTime(date);
            claims.setNotBeforeMinutesInThePast(1);
            // Tambahkan parameter kustom. Semua nilai harus bertipe String.
            // Atur identifikasi konsumen.
            claims.setClaim("uid", "11215ac069234abcb8944232b79ae711");
            JsonWebSignature jws = new JsonWebSignature();
            // Atur algoritma enkripsi.
            jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256);
            jws.setKey(new HmacKey(Base64.decode(JsonUtil.parseJson(privateKeyJson).get("k").toString())));
            jws.setPayload(claims.toJson());
            String jwtResult = jws.getCompactSerialization();
            System.out.println("Generate Json Web token , result is \n " + jwtResult);
        }
    }

    Pengaturan kode:

    • privateKeyJson: JWKS yang digunakan saat membuat konsumen. Simpan JWKS selama pembuatan konsumen, atau ambil dari halaman konfigurasi dasar konsumen.

    • Atur identifikasi konsumen. Pernyataannya adalah claims.setClaim("uid", "11215ac069234abcb8944232b79ae711"). Identifikasi ini dibuat otomatis saat Anda membuat konsumen tetapi dapat dimodifikasi. Anda juga dapat mengambilnya dari halaman konfigurasi dasar konsumen.

    • Atur algoritma enkripsi. Pernyataannya adalah jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256). Algoritma ini harus sesuai dengan yang ada di JWKS.

      Catatan

      Algoritma enkripsi yang didukung meliputi ES256, ES384, ES512, RS256, RS384, RS512, PS256, PS384, PS512, HS256, HS384, HS512, dan EdDSA.

      Untuk enkripsi simetris, nilai "k" harus didekode.

      jws.setKey(new HmacKey(Base64.decode(JsonUtil.parseJson(privateKeyJson).get("k").toString())));
    • Atur waktu kedaluwarsa. Token harus kedaluwarsa dalam waktu tujuh hari. Setelah kedaluwarsa, hasilkan token baru.

      ...
          NumericDate date = NumericDate.now();
          date.addSeconds(120*60);
          claims.setExpirationTime(date);
          claims.setNotBeforeMinutesInThePast(1);
      ...
    • Anda dapat menambahkan parameter kustom ke PAYLOAD JWKS sesuai kebutuhan.

    Kunci asimetris

    Kode contoh:

    package org.example;
    
    import java.security.PrivateKey;
    import org.jose4j.json.JsonUtil;
    import org.jose4j.jws.AlgorithmIdentifiers;
    import org.jose4j.jws.JsonWebSignature;
    import org.jose4j.jwt.JwtClaims;
    import org.jose4j.jwt.NumericDate;
    import org.jose4j.lang.JoseException;
    import org.jose4j.jwk.RsaJsonWebKey;
    
    public class Main {
        public static void main(String[] args) throws JoseException {
            // Contoh kunci dalam format JWK.
            String privateKeyJson = "{"
                    + "\"kty\":\"RSA\","
                    + "\"n\":\"u-8lR9lyRhu8tl4vRxOl7yfshssx5jRstabc9n4Rxrz102Z7TPFYrXBZHgf67Y0d-zx9tWd5j91WZxLHv4K6VWPN7zEWEQNn3vUg76dPHPzVkZJWziFPS1EvS4a2gRZdrE4nPogaQ72WySVC0yUF2fL0NKeOclD__coCFxn4QQjcDXyu_CUbI_FuDcdw267mVjjylAaFvOZHH0pXsV8m5zXlpc2aiemWYQJD9MtWRcoKlexWMkTwbEqW5-NWAl0Uo202ahDA1NiaQ98Ch4nw6g2E1GvwxxHkbvMuZcs5z8F5Ct_w0IPtvY7ngSyEN-WCU40oj-C5NUCy_73FpXXdWQ\","
                    + "\"e\":\"AQAB\","
                    + "\"d\":\"Uxg1IqSZazg-Y2AXhVTBrJG5egwD3yZU3qiN0IsDbx0DkFoisG2R6PXg4W9j2n7nv7sKVhgPXrXdyys5mIrDuperaVQJzrHzzlgSHQSb7VQ5Vekfanq95a5avAkvTrpF5raTkYl6G3OLZRqNhnA7Oxe6NEHVsOPxnBQignZgFtiBtCSZY4RVH6Dx4jFfBBNMC9ifyLWLpHut7eczvxI412nBkxgtEjSeFe083NlumO_ZYHbijPcQf5zFWPLEj2EvlgbSwhjc-uSAF4OljAyG_DHZYvztEIGMdxMgBHgwtEvCfzS6PeUgvUR-SB7m_L8z4gjz6TlpSYe3CnZqE69KdQ\","
                    + "\"p\":\"9mNw8U_GxbcSknueUeFFSU9wKD9E9P2ZO5RP5d7o3qGUXOfbrH_g5GMH3YJiPBDZs_2BYFrAACOY4YM-QTiXWVs4xS3OeD8AdH3wEXR_3DMEkOez3cNq3Jy3ZJabm7IUnPMIWv5gpIHghcx0YTtM5RabSgexLMKh2-6sB466378\","
                    + "\"q\":\"w0PzXI_8Q5jv15OUq-dV_Z0kp91Icumf6PEERZN4v3i3VolLBnamMiIQiF74ywclKpZmtfOQTfyL41Xj2vbm2Aus6akRsU3NhQlVtIQTzHWUuEQgMIJYDK7--FzEcZORm1qBiEffiWv6U-slyCcLcNDNT-wjMX8BrS4oWHIoCOc\","
                    + "\"dp\":\"fRRiY76yE_EqVn63Eq4ftGXFdEkaQpzzS1GxderBoTO506hI1rtcedTkS0lDgWa0fjE1mqq3SdrIY8NyuT13Z_9tRHxKkrS5EGpWkyXnOuwTZ1SY9P2dpD1SxJfIizPOTxb5qOf2O81LI-F1O18VXD8rultJUIXGEZaKcpO8vpU\","
                    + "\"dq\":\"V6EP_vMzD5b707AMYVURFx7Fi3vX_pHvzJcVBrBW2P6wsGouvDjU_tygtMKCPoL3X_RdJbynfwgeMyihd-ujz0L2F2pjYUF8QP7ecoNvays9UbBpDbwBDbge_pCLLDlAeAqW5PT0UXSew7hcnUVAciGSchKT_Kt1siVrv72DT_M\","
                    + "\"qi\":\"w5fENzxOivbbbUbawAWSuLgWPtvbTKn2XuPzwr_JzZH08-nadWwQFChcvAiCs8V-306TQOh8NfY308QpGDIq-iRfrS7CEePOjRzpHJfsaQ1IFQqzgDZ9VGdJRDlZqRHx0DbqwMlleVKTC6ER6varalbr4lKU-ZPUQLCzj0e4PMs\""
                    + "}";
    
            JwtClaims claims = new JwtClaims();
            claims.setGeneratedJwtId(); // Hasilkan JTI (JWT ID) secara otomatis.
            claims.setIssuedAtToNow();  // Atur waktu diterbitkan (iat) ke waktu saat ini.
    
            // Atur waktu kedaluwarsa kurang dari 7 hari.
            NumericDate date = NumericDate.now();
            date.addSeconds(120 * 60); // Atur kedaluwarsa menjadi 120 menit dari sekarang.
            claims.setExpirationTime(date);
            claims.setNotBeforeMinutesInThePast(1); // Atur waktu not before (nbf) menjadi 1 menit di masa lalu.
    
            // Tambahkan parameter kustom. Semua nilai harus bertipe String.
            // Atur identifikasi konsumen.
            claims.setClaim("uid", "11215ac069234abcb8944232b79ae711");
    
            JsonWebSignature jws = new JsonWebSignature();
            // Atur algoritma enkripsi ke RSA-SHA256.
            jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
    
            // Urai kunci privat dan atur dalam penandatangan.
            PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyJson)).getPrivateKey();
            jws.setKey(privateKey);
    
            // Atur konten payload.
            jws.setPayload(claims.toJson());
    
            // Hasilkan JWT.
            String jwtResult = jws.getCompactSerialization();
            System.out.println("Generate Json Web token , result is \n " + jwtResult);
        }
    }
    

    Pengaturan kode:

    • Pengaturan untuk privateKeyJson, identifikasi konsumen, dan waktu kedaluwarsa mirip dengan enkripsi simetris.

      Atur algoritma enkripsi dengan pernyataan jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256). Algoritma ini harus sesuai dengan yang ada di JWKS.

      Untuk algoritma enkripsi asimetris, Anda harus menggunakan kunci privatnya untuk enkripsi.

      ...
          jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
          PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyJson)).getPrivateKey();
          jws.setKey(privateKey);
      ...
    • Anda dapat menambahkan parameter kustom ke PAYLOAD JWT.

Kirim permintaan bisnis

API Gateway berbasis cloud mendukung pengiriman token dalam header permintaan. Anda dapat menyesuaikan nama header dan awalan token. Kunci dan awalan dalam permintaan harus sesuai dengan yang dikonfigurasi dalam metode autentikasi konsumen.

  • Permintaan tanpa JWT mengembalikan error 401.

    curl  http://xxx.hello.com/test
  • Permintaan dengan JWT tidak valid mengembalikan error 401.

    curl  http://xxx.hello.com/test -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ1'
  • Jika permintaan mencakup JWT yang valid tetapi konsumen tidak diotorisasi untuk API atau rute tersebut, error 403 dikembalikan.

    # consumer1 tidak diotorisasi untuk rute atau API pada path yang ditentukan.
    
    curl  'http://xxx.example.com/test' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ4'

Validasi token di sisi server

Validasi token memiliki tiga langkah:

  1. Periksa apakah permintaan mencakup token. Jika tidak, tolak dengan kode 401.

  2. Verifikasi validitas dan kedaluwarsa token menggunakan kunci publik dari JWKS konsumen. Jika tidak valid atau kedaluwarsa, tolak dengan kode 401.

  3. Periksa apakah konsumen diotorisasi untuk mengakses API atau rute yang diminta.

Kode kesalahan umum

Kode status HTTP

Pesan kesalahan

Deskripsi

401

Jwt missing

JWT tidak ada dalam header permintaan.

401

Jwt expired

JWT telah kedaluwarsa.

401

Jwt verification fails

Verifikasi payload JWT gagal, misalnya karena ketidaksesuaian iss.

403

Access Denied

Tidak memiliki izin untuk mengakses rute saat ini.

Autentikasi AK/SK (HMAC)

Pembuatan signature di sisi klien

Klien menghasilkan signature dalam tiga langkah:

  1. Ekstrak string yang akan ditandatangani: Ekstrak data kunci dari permintaan asli untuk membentuk string yang akan ditandatangani.

  2. Buat signature: Enkripsi string yang akan ditandatangani dengan SK untuk menghasilkan signature akhir.

  3. Tambahkan signature: Tambahkan semua header terkait signature ke permintaan HTTP asli untuk membentuk permintaan akhir.

Langkah 1: Ekstrak string yang akan ditandatangani

Ekstrak data kunci dari permintaan HTTP dan susun menjadi string yang akan ditandatangani dalam format berikut:

HTTPMethod
Accept
Content-MD5
Content-Type
Date
Headers
PathAndParameters

Ketujuh bidang ini membentuk string yang akan ditandatangani, dipisahkan oleh karakter baris baru (\n). Jika bidang Headers kosong, tidak perlu baris baru setelahnya. Untuk bidang kosong lainnya, sertakan karakter baris barunya. Signature bersifat case-sensitive. Setiap bidang diekstrak sebagai berikut:

  • HTTPMethod: Metode HTTP, dalam huruf kapital. Contoh: POST.

  • Accept: Nilai header Accept. Bisa kosong. Kami menyarankan agar Anda menyetel header Accept secara eksplisit. Jika kosong, beberapa klien HTTP menetapkan nilai default */*, yang menyebabkan verifikasi signature gagal.

  • Content-MD5: Nilai header Content-MD5. Bisa kosong. Hitung hanya untuk permintaan dengan body non-form. Kode Java berikut menunjukkan cara menghitung nilai Content-MD5:

    String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));
  • Content-Type: Nilai header Content-Type. Bisa kosong.

  • Date: Nilai header Date. Jika date_offset tidak diaktifkan, ini bisa kosong. Jika diaktifkan, digunakan untuk verifikasi offset waktu.

  • Headers: Pilih header tertentu untuk disertakan dalam signature. Gabungkan sebagai berikut:

    • Urutkan kunci header secara alfabetis dan gabungkan:

      HeaderKey1 + ":" + HeaderValue1 + "\n"\+
      HeaderKey2 + ":" + HeaderValue2 + "\n"\+
      ...
      HeaderKeyN + ":" + HeaderValueN + "\n"
    • Jika nilai header kosong, gunakan HeaderKey+":"+"\n" untuk signature, tetap menyertakan kunci dan titik dua.

    • Cantumkan kunci semua header yang ditandatangani dalam header X-Ca-Signature-Headers, dipisahkan koma.

    • Header berikut tidak disertakan dalam perhitungan signature: X-Ca-Signature, X-Ca-Signature-Headers, Accept, Content-MD5, Content-Type, dan Date.

  • PathAndParameters: Mencakup path, parameter kueri, dan parameter form. Dibangun sebagai berikut:

    Path + "?" + Key1 + "=" + Value1 + "&" + Key2 + "=" + Value2 + ... "&" + KeyN + "=" + ValueN
    Penting
    • Urutkan kunci parameter kueri dan form secara alfabetis sebelum menggabungkan.

    • Jika parameter kueri dan form kosong, gunakan Path langsung tanpa ?.

    • Jika nilai parameter kosong, sertakan hanya kuncinya. Tanda sama dengan (=) tidak disertakan.

    • Jika kueri atau form berisi parameter array (kunci sama, nilai berbeda), gunakan nilai pertama untuk perhitungan signature.

Langkah 2: Buat signature

Enkripsi dan encode string yang akan ditandatangani untuk menghasilkan signature akhir. Pada contoh berikut, stringToSign adalah string yang diekstrak, secret adalah SK dari konfigurasi AK/SK, dan sign adalah signature yang dihasilkan:

Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] secretBytes = secret.getBytes("UTF-8");
hmacSha256.init(new SecretKeySpec(secretBytes, 0, secretBytes.length, "HmacSHA256"));
byte[] result = hmacSha256.doFinal(stringToSign.getBytes("UTF-8"));
String sign = Base64.encodeBase64String(result);

Decode stringToSign menjadi array byte UTF-8, enkripsi, dan encode hasilnya dengan Base64 untuk menghasilkan signature.

Langkah 3: Tambahkan signature ke permintaan

Sertakan empat header berikut dalam permintaan HTTP untuk verifikasi signature:

  • x-ca-key: AK dari konfigurasi autentikasi AK/SK.

  • x-ca-signature-method: Algoritma signature. Nilai yang valid adalah HmacSHA256 atau HmacSHA1. Ini opsional dan default-nya adalah HmacSHA256.

  • x-ca-signature-headers: Daftar kunci header yang disertakan dalam signature, dipisahkan koma. Ini opsional.

  • x-ca-signature: Signature. Ini wajib.

Verifikasi signature di sisi server

Verifikasi signature di sisi server bekerja sebagai berikut:

  1. Ekstrak string yang akan ditandatangani: Ekstrak data kunci dari permintaan yang diterima untuk membentuk string yang akan ditandatangani.

  2. Ambil SK: Baca AK dari permintaan dan gunakan untuk mengambil SK yang sesuai.

  3. Hitung signature: Gunakan algoritma enkripsi yang sama dan SK yang diambil untuk mengenkripsi string yang akan ditandatangani, yang menghasilkan signature sisi server.

  4. Verifikasi signature: Baca signature sisi klien dari permintaan dan bandingkan dengan signature sisi server untuk kecocokan.

Troubleshooting

Saat verifikasi signature gagal, server mengembalikan string yang akan ditandatangani (StringToSign) dalam header respons X-Ca-Error-Message. Bandingkan StringToSign sisi server dengan yang Anda hitung secara lokal. Jika cocok, periksa apakah Anda menggunakan SK yang benar. Karena header HTTP tidak dapat berisi karakter baris baru, baris baru dalam StringToSign diganti dengan #:

X-Ca-Error-Message:  Server StringToSign:`GET#application/json##application/json##X-Ca-Key:200000#X-Ca-Timestamp:1589458000000#/app/v1/config/keys?keys=TEST`

Kode kesalahan terkait

Kode status HTTP

Pesan kesalahan

Deskripsi

401

Invalid Key

Header x-ca-key tidak ada atau kuncinya tidak valid.

401

Empty Signature

Header x-ca-signature tidak ada.

400

Invalid Signature

Signature dalam header x-ca-signature tidak cocok dengan signature yang dihitung oleh server.

400

Invalid Content-MD5

Header Content-MD5 salah.

400

Invalid Date

Offset waktu yang dihitung dari header Date melebihi date_offset yang dikonfigurasi.

413

Request Body Too Large

Ukuran body permintaan melebihi batas 32 MB.

413

Payload Too Large

Body permintaan melebihi DownstreamConnectionBufferLimits yang dikonfigurasi secara global.

403

Unauthorized Consumer

Pemanggil permintaan tidak diotorisasi.

Kode contoh (Go)

go
package main
import (
	"bytes"
	"crypto/hmac"
	"crypto/md5"
	"crypto/sha256"
	"encoding/base64"
	"fmt"
	"io"
	"net/http"
	"strings"
	"time"
)
func generateHMACSignature(toSign string, key string) (string, error) {
	h := hmac.New(sha256.New, []byte(key))
	h.Write([]byte(toSign))
	return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil
}
func test(accessKey, secretKey string) {
	body := `{"hello":"world"}`
	h := md5.New()
	h.Write([]byte(body))
	payload := base64.StdEncoding.EncodeToString(h.Sum(nil))
	headers := map[string]string{
		"accept":                 "application/json",
		"content-type":           "application/json",
		"date":                   time.Now().Format("2006-01-02 15:04:05"),
		"x-ca-key":               accessKey,
		"foo":                    "bar",
		"x-ca-signature-headers": "foo",
		"content-md5":            payload,
	}
	sts := strings.Join([]string{"POST", headers["accept"], headers["content-md5"], headers["content-type"], headers["date"], "foo:bar", "/post"}, "\n")
	fmt.Printf("String to sign is: %s\n", strings.ReplaceAll(sts, "\n", "#"))
	sign, _ := generateHMACSignature(sts, secretKey)
	fmt.Printf("Signed string is: %s\n", sign)
	headers["x-ca-signature"] = sign
	req, _ := http.NewRequest("POST", "http://localhost:8080/post", bytes.NewBufferString(body))
	for k, v := range headers {
		req.Header.Add(k, v)
	}
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("read body error")
	}
	defer resp.Body.Close()
	fmt.Println("Headers are as follows:")
	for k, v := range resp.Header {
		// Jika verifikasi signature gagal, header respons X-Ca-Error-Message
		// berisi string to sign sisi server, yang dapat digunakan untuk troubleshooting.
		fmt.Printf("  %s: %s\n", k, v)
	}
	respBody, _ := io.ReadAll(resp.Body)
	fmt.Println(string(respBody))
}
func main() {
	test("appKey", "appSecret")
}

Autentikasi kunci API

Gateway mengautentikasi permintaan berdasarkan sumber kredensial yang dikonfigurasi. Prosesnya serupa untuk API dan rute. Contoh berikut menggunakan rute.

Terdapat tiga jenis sumber kredensial untuk kunci API:

  1. Sumber kredensial default: Authorization: Bearer <token>.

  2. Header kustom: Berikan nama header.

  3. Parameter kueri kustom: Berikan nama parameter kueri.

Sumber kredensial default

Asumsikan permintaan sesuai dengan rute abc. Kunci API disediakan dalam header Authorization dengan awalan Bearer (perhatikan spasi di akhir).

curl  http://xxx.test.com/test -H 'Authorization: Bearer 2bda943c-ba2b-11ec-ba07-00163e1250b5'

Atur kunci API dalam header permintaan

curl  http://xxx.test.com/test -H 'x-api-key: 2bda943c-ba2b-11ec-ba07-00163e1250b5'

Sumber header kustom

Asumsikan permintaan sesuai dengan rute abc, dan kunci API berada dalam header kustom.

  • Jika kunci API berada di lokasi yang salah (misalnya, sebagai parameter kueri alih-alih header kustom yang dikonfigurasi), permintaan ditolak dengan kode 401.

    curl  http://xxx.test.com/test?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5
  • Jika kebijakan diaktifkan tetapi konsumen tidak diotorisasi, permintaan ditolak dengan kode 403.

    curl  http://xxx.test.com/test -H 'x-api-key: 2bda943c-ba2b-11ec-ba07-00163e1250b5'

Parameter kueri kustom

Asumsikan permintaan sesuai dengan rute abc, dan kunci API berada dalam parameter URL.

  • Jika autentikasi konsumen tidak diaktifkan untuk rute tersebut, permintaan ditolak dengan kode 401.

    curl  http://xxx.test.com/test?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5
  • Jika kebijakan diaktifkan tetapi konsumen tidak diotorisasi, permintaan ditolak dengan kode 403.

    curl  http://xxx.test.com/test?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5

Kode kesalahan terkait

Kode status HTTP

Pesan kesalahan

Deskripsi

401

Request denied by Key Auth check. Multi API key found in request.

Beberapa kunci API disediakan dalam permintaan.

401

Request denied by Key Auth check. No API key found in request.

Tidak ada kunci API yang disediakan dalam permintaan.

401

Request denied by Key Auth check. Invalid API key.

Kunci API yang disediakan tidak diizinkan untuk mengakses.

403

Request denied by Key Auth check. Unauthorized consumer.

Pemanggil permintaan tidak diotorisasi.

Referensi

Anda dapat memberikan otorisasi dan mengelola API Anda melalui Authorization management.