Tüm Ürünler
Search
Belge Merkezi

API Gateway:Hmac-auth

Son Güncelleme:Oct 04, 2026

Hmac-auth eklentisi, HTTP istekleri için HMAC algoritmasına dayalı sahtelenemez imzalar oluşturur ve kimlik doğrulama amacıyla bu imzaları kullanır.

Eklenti türü

Kimlik doğrulama ve yetkilendirme.

Alanlar

Kimlik doğrulama yapılandırması


Alan


Veri türü


Zorunlu


Varsayılan değer


Açıklama


consumers


object dizisi


Evet


-


Hizmet çağrıları; isteklerin kimliğini doğrulamak için kullanılır.


date_offset


sayı


Hayır


-


Saniye cinsinden izin verilen maksimum istemci saat farkı. Sistem, yeniden oynatma saldırılarını önlemek için istemcinin UTC saatini Date istek başlığından ayrıştırır. Yapılandırılmazsa sistem istemci UTC saatini doğrulamaz.


global_auth


dize dizisi


Hayır (Yalnızca örnek düzeyi yapılandırmalar için zorunludur)


-


Yalnızca örnek düzeyinde geçerlidir. True olarak ayarlandığında kimlik doğrulama genel olarak etkinleşir. False olarak ayarlandığında kimlik doğrulama yalnızca yapılandırılmış alan adlarına ve rotalara uygulanır. Yapılandırılmadığında, herhangi bir alan adı veya rota yapılandırılmamışsa kimlik doğrulama genel olarak etkinleşir.

consumers içindeki alanlar:


Alan


Veri türü


Zorunlu


Varsayılan değer


Açıklama


key


dize


Evet


-


Tüketici erişim anahtarı.


secret


dize


Evet


-


İmza oluşturmak için kullanılan gizli anahtar.


name


dize


Evet


-


Tüketicinin adı.

(İsteğe bağlı) Yetkilendirme yapılandırması


Alan


Veri türü


Zorunlu


Varsayılan değer


Açıklama


allow


dize dizisi


Hayır (Örnek dışı düzey yapılandırmalar için zorunludur)


-


Yalnızca rota veya alan adı düzeyinde yapılandırılabilir. Hangi tüketicilerin eşleşen isteklere erişebileceğini belirterek ayrıntılı izin kontrolü sağlar.

Önemli
  • Yetkilendirme ve kimlik doğrulama yapılandırmaları aynı kuralda birlikte bulunamaz.

  • Kimliği doğrulanmış istekler için, çağrıyı tanımlamak amacıyla X-Mse-Consumer başlığı eklenir.

Örnekler

Kimlik doğrulamayı genel olarak yapılandırma ve rotalar için yetkilendirme ayarlama

Aşağıdaki örnek, belirli rotalar veya alan adları için hmac-auth kimlik doğrulamasını etkinleştirir. key alanı benzersiz olmalıdır.

Aşağıdaki eklenti yapılandırmalarını örnek düzeyinde uygulayın:

global_auth: false
consumers: 
- key: appKey-example-1
  secret: appSecret-example-1
  name: consumer-1
- key: appKey-example-2
  secret: appSecret-example-2
  name: consumer-2

Aşağıdaki eklenti yapılandırmasını route-a ve route-b rotalarına uygulayın:

allow:
- consumer1

Aşağıdaki eklenti yapılandırmasını *.example.com ve test.com alan adlarına uygulayın:

allow:
- consumer2
Not
  • Bu örnekte route-a ve route-b rotaları, ağ geçidi rotaları oluşturulurken belirtilen rotalardır. Bir istemci isteği bu rotalardan biriyle eşleşirse, name değeri consumer1 olan çağrı ağ geçidine erişebilir. Diğer çağrılar erişemez.

  • Bu örnekte *.example.com ve test.com alan adları, isteklerdeki alan adlarıyla eşleşmek için kullanılır. Bir istemci isteği bu alan adlarından biriyle eşleşirse, name değeri consumer2 olan çağrı ağ geçidine erişebilir. Diğer çağrılar erişemez.

Ağ geçitleri için traffic-tag eklentisini etkinleştirme

global_auth: true
consumers: 
- key: appKey-example-1
  secret: appSecret-example-1
  name: consumer-1
- key: appKey-example-2
  secret: appSecret-example-2
  name: consumer-2

İmzalama mekanizması

Yapılandırma hazırlıkları

İmza oluşturmak ve doğrulamak için aşağıdaki kimlik bilgilerini yapılandırın:

  • key: x-ca-key istek başlığında kullanılır.

  • secret: İstek imzasını oluşturmak için kullanılır.

İstemcide imza oluşturma

Süreç

İstemci şu adımları izleyerek bir imza oluşturur:

  1. Orijinal istekten anahtar verileri çıkararak bir imza dizesi oluşturun.

  2. Yapılandırılmış secret ile imza dizesini şifreleyerek imzayı üretin.

  3. Tüm imza ile ilgili başlıkları orijinal HTTP isteğine ekleyin.

İmza dizesi çıkarma

İstemci, HTTP isteğinden anahtar verileri çıkarır ve bunları aşağıdaki biçimde bir imza dizesi halinde birleştirir:

HTTPMethod
Accept
Content-MD5
Content-Type
Date
Headers
PathAndParameters

Bu alanlar \n karakteriyle ayrılır. Headers alanı boşsa \n gerekmez. Diğer boş alanlar için \n karakteri korunmalıdır. İmza büyük/küçük harfe duyarlıdır.

Her alan için çıkarma kuralları:

  • HTTPMethod: HTTP yöntemi (örneğin POST). Büyük harfle yazılmalıdır.

  • Accept: Accept istek başlığının değeri. Boş bırakılabilir. Bazı HTTP istemcileri varsayılan olarak */* değerini kullandığından imza doğrulamasının başarısız olmasına neden olabilir; bu nedenle Accept başlığını açıkça ayarlamanız önerilir.

  • Content-MD5: Content-MD5 başlığının değeri. Boş bırakılabilir. Yalnızca istek form dışı bir gövde içerdiğinde hesaplanır. Java örneği:

    String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));
  • Content-Type: Content-Type başlığının değeri. Boş bırakılabilir.

  • Date: Date başlığının değeri; saat farkı doğrulaması için kullanılır. date_offset yapılandırılmamışsa boş bırakılabilir.

  • Headers: İmzaya dahil edilen başlıklar. Birleştirme kuralları:

    • Başlık anahtarlarını alfabetik olarak sıralayın ve aşağıdaki gibi birleştirin:

      HeaderKey1 + ":" + HeaderValue1 + "\n"\+
      HeaderKey2 + ":" + HeaderValue2 + "\n"\+
      ...
      HeaderKeyN + ":" + HeaderValueN + "\n"
    • Bir başlık değeri boşsa imza için HeaderKey + ":" + "\n" kullanın. Anahtar ve iki nokta üst üste işareti (:) korunmalıdır.

    • İmza için kullanılan başlık anahtarları virgülle (,) ayrılır ve X-Ca-Signature-Headers başlığına yerleştirilir.

    • Aşağıdaki başlıklar imza hesaplamasında kullanılamaz: X-Ca-Signature, X-Ca-Signature-Headers, Accept, Content-MD5, Content-Type ve Date.

  • PathAndParameters: Yol, sorgu ve form parametrelerini içerir.

    Path + "?" + Key1 + "=" + Value1 + "&" + Key2 + "=" + Value2 + ... "&" + KeyN + "=" + ValueN
Not
  • Sorgu ve form parametresi anahtarları alfabetik olarak sıralanır ve yukarıda açıklandığı gibi birleştirilir.

  • Sorgu ve form parametreleri boşsa, imza bilgisi eklemeden yalnızca yol kullanılır.

  • Aynı anahtara sahip ancak farklı değerlere sahip dizi parametreleri için imza hesaplamasında yalnızca ilk değer kullanılır.

İmza dizesi çıkarma örneği

İlk HTTP isteği:

POST /http2test/test?param1=test HTTP/1.1
host:api.alibabacloud.com
accept:application/json; charset=utf-8
ca_version:1
content-type:application/x-www-form-urlencoded; charset=utf-8
x-ca-timestamp:1525872629832
date:Wed, 09 May 2018 13:30:29 GMT+00:00
user-agent:ALIYUN-ANDROID-DEMO
x-ca-nonce:c9f15cbf-f4ac-4a6c-b54d-f51abf4b5b44
content-length:33
username=xiaoming&password=123456789

Oluşturulan imza dizesi:

POST
application/json; charset=utf-8
application/x-www-form-urlencoded; charset=utf-8
Wed, 09 May 2018 13:30:29 GMT+00:00
x-ca-key:203753385
x-ca-nonce:c9f15cbf-f4ac-4a6c-b54d-f51abf4b5b44
x-ca-signature-method:HmacSHA256
x-ca-timestamp:1525872629832
/http2test/test?param1=test&password=123456789&username=xiaoming

İmza hesaplama

İmza dizesini oluşturduktan sonra istemci, bunu şifreleyip kodlayarak nihai imzayı üretir.

Bu kodda stringToSign çıkarılan imza dizesidir, secret eklenti yapılandırmasından alınır ve sign nihai imzadır.

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

stringToSign UTF-8 bayt dizisine dönüştürülür, HMAC algoritmasıyla şifrelenir ve ardından imzayı üretmek için Base64 ile kodlanır.

İmza ekleme

Cloud-native API Gateway'e gönderilen isteklere imza doğrulaması için aşağıdaki başlıkları dahil edin:

  • x-ca-key: AppKey. Zorunludur.

  • x-ca-signature-method: İmzalama algoritması. İsteğe bağlıdır. Geçerli değerler: HmacSHA256 ve HmacSHA1. Varsayılan değer: HmacSHA256.

  • x-ca-signature-headers: Tüm imza başlığı anahtarları, virgülle (,) ayrılmış şekilde. İsteğe bağlıdır.

  • x-ca-signature: İmza. Zorunludur.

İmza içeren örnek HTTP isteği:

POST /http2test/test?param1=test HTTP/1.1
host:api.alibabacloud.com
accept:application/json; charset=utf-8
ca_version:1
content-type:application/x-www-form-urlencoded; charset=utf-8
x-ca-timestamp:1525872629832
date:Wed, 09 May 2018 13:30:29 GMT+00:00
user-agent:ALIYUN-ANDROID-DEMO
x-ca-nonce:c9f15cbf-f4ac-4a6c-b54d-f51abf4b5b44
x-ca-key:203753385
x-ca-signature-method:HmacSHA256
x-ca-signature-headers:x-ca-timestamp,x-ca-key,x-ca-nonce,x-ca-signature-method
x-ca-signature:xfX+bZxY2yl7EB/qdoDy9v/uscw3Nnj1pgoU+Bm6xdM=
content-length:33
username=xiaoming&password=123456789

Sunucu tarafında imzayı doğrulama

Süreç

Sunucu, istemci imzasını şu adımlarla doğrular:

  1. İstekten anahtar verileri çıkararak bir imza dizesi elde edin.

  2. İstekteki key değerini okuyun ve karşılık gelen secret değerini bulun.

  3. secret ile imza dizesini şifreleyerek bir imza oluşturun.

  4. Sunucu tarafındaki imzayı, istekteki istemci tarafı imzasıyla karşılaştırın.

İmza hatalarını giderme

İmza doğrulaması başarısız olduğunda sunucu, sunucu tarafındaki StringToSign değerini X-Ca-Error-Message yanıt başlığında döndürür. Farklılığı tespit etmek için bunu istemci tarafındaki StringToSign değeriyle karşılaştırın.

İki değer eşleşiyorsa imza hesaplaması için kullanılan AppSecret değerini doğrulayın.

HTTP başlıkları satır sonlarını desteklemediğinden StringToSign içindeki satır sonları # karakteriyle değiştirilir.

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`

Hata kodları


HTTP durum kodu


Hata iletisi


Neden


400


Invalid Signature.


x-ca-signature içindeki imza, sunucunun hesapladığı imzayla eşleşmiyor.


400


Invalid Content-MD5.


Content-MD5 istek başlığı geçersiz.


400


Invalid Date.


Date istek başlığındaki saat farkı, yapılandırılan date_offset değerini aşıyor.


401


Invalid Key.


x-ca-key istek başlığı eksik veya geçersiz.


401


Empty Signature.


x-ca-signature istek başlığı boş.


403


Unauthorized Consumer.


İsteği yapan çağrının erişim izni yok.


413


Request Body Too Large.


İstek gövdesi 32 MB'yi aşıyor.


413


Payload Too Large.


İstek gövdesi ağ geçidi için yapılandırılan DownstreamConnectionBufferLimits sınırını aşıyor. Parametre yapılandırma sayfasında DownstreamConnectionBufferLimits değerini artırabilirsiniz.

Not

DownstreamConnectionBufferLimits değerini artırmak ağ geçidinin bellek kullanımını önemli ölçüde artırır. Dikkatli olun.