Tüm Ürünler
Search
Belge Merkezi

API Gateway:Tüketici kimlik doğrulaması ve yetkilendirmesi

Son Güncelleme:Oct 04, 2026

Cloud-native API Gateway; genel kimlik doğrulama, rota düzeyinde kimlik doğrulama ve tüketici yetkilendirmesini destekler. Bu konuda her bir kimlik doğrulama yönteminin nasıl yapılandırılacağı ve tüketicilerin belirli rotalara ve API'lere erişiminin nasıl yetkilendirileceği açıklanır.

Arka plan

Genel kimlik doğrulama, tek oturum açma gibi B2C senaryolarına uygundur. Rotalar ve API'ler için tüketici kimlik doğrulaması ise iş ortaklarına API erişimi sağlama gibi B2B senaryolarına uygundur.

Öğe

Genel kimlik doğrulama

Rota kimlik doğrulaması ve tüketici yetkilendirmesi

Kullanım durumları

Tek oturum açma kimlik doğrulaması gibi B2C senaryoları.

İş ortaklarına API erişimi sağlama gibi B2B senaryoları.

Ana fark

Kimlik doğrulama etkinleştirildiğinde yetkilendirme de otomatik olarak etkinleşir.

Kimlik doğrulamayı etkinleştirdikten sonra yetkilendirmeyi ayrı olarak yapılandırmanız gerekir.

Yapılandırma yolu

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.

Kimlik doğrulama yöntemi yapılandırması (JWT kimlik doğrulama örneği)

  1. Yapılandırma oluştururken genel JWKS yapılandırmasını sağlayın.

  2. JWT'yi doğrulamak için issue ve sub alanlarını girin.

  1. Tüketici yapılandırması oluştururken, o tüketiciye karşılık gelen JWKS yapılandırmasını sağlayın.

  2. JWT'nin doğru tüketiciye ait olduğunu doğrulamak için bir tüketici tanımlayıcısı sağlayın. Varsayılan olarak bu, payload içindeki uid alanıdır ancak bunu özelleştirebilirsiniz.

Yetkilendirme yöntemi yapılandırması

Yapılandırma oluştururken, engelleme listesi veya izin listesi için bir Domain Name ve Path listesi sağlayın.

  • Blacklist Mode: Listede bulunan bir Domain Name ve Path adresine yapılan isteklerin kimlik doğrulaması gerekir. Diğer tüm isteklerde kimlik doğrulama gerekmez.

  • Whitelist Mode: Listede bulunan bir alan adına ve Path adresine yapılan isteklerde kimlik doğrulama gerekmez. Diğer tüm isteklerin kimlik doğrulaması yapılmalıdır.

  1. Bir rota veya API için Configure Policy ayarlarında Authentication seçeneğini etkinleştirin.

  2. Consumer Authorization bölümünde, yetkilendirme sürecini tamamlamak için tüketiciye kimlik doğrulamalı rotaya veya API'ye erişim izni verin.

Kullanım notları

Tüketici kimlik doğrulamasını etkinleştirdikten sonra ilke hemen yürürlüğe girer. Yayınlanmış bir rota veya API için herhangi bir tüketici veya yetkilendirme kuralı yapılandırılmamışsa ağ geçidi varsayılan olarak tüm istekleri reddeder.

Tüketici kimlik doğrulaması ve yetkilendirmesini kullanma

JWT kimlik doğrulaması

JWT kimlik doğrulama iş akışı

  1. İstemci, genellikle son kullanıcının kullanıcı adı ve parolasıyla ağ geçidine bir kimlik doğrulama isteği gönderir.

  2. Ağ geçidi isteği arka uç hizmetine iletir.

  3. Arka uç kimlik bilgilerini doğrular. Doğrulama başarılı olduktan sonra özel bir anahtarla bir belirteç oluşturur ve belirteci ağ geçidine döndürür.

  4. Ağ geçidi belirteci istemciye döndürür. İstemci bu belirteci yerel olarak önbelleğe alır.

  5. İstemci, önbelleğe alınan belirteçle birlikte bir iş isteğini ağ geçidine gönderir.

  6. Ağ geçidi, yapılandırılmış genel anahtarı kullanarak belirteci doğrular. Belirteç geçerliyse ağ geçidi isteği arka uca iletir.

  7. Arka uç isteği işler ve bir yanıt döndürür.

  8. Ağ geçidi yanıtı istemciye iletir.

Aşağıdaki bölümlerde bir belirtecin nasıl oluşturulacağı, ağ geçidine nasıl istek gönderileceği ve yapılandırılmış genel anahtar kullanılarak belirtecin nasıl doğrulanacağı açıklanır.

Bir belirteç oluşturma

Aşağıdaki Java örneği bir belirtecin nasıl oluşturulacağını gösterir. Benzer araçları diğer dillerde de kullanabilirsiniz.

  1. Bir Maven projesi oluşturun ve bağımlılığı ekleyin.

    Projeye aşağıdaki bağımlılığı ekleyin:

    <dependency>
        <groupId>org.bitbucket.b_c</groupId>
        <artifactId>jose4j</artifactId>
        <version>0.7.0</version>
    </dependency>
  2. Belirteci oluşturmak için bir yöntem seçin.

    Belirteci simetrik veya asimetrik bir anahtar kullanarak oluşturabilirsiniz.

    Simetrik anahtar

    Örnek kod:

    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 {
            // Use the example from this topic.
            String privateKeyJson = "{\n"
                    + "    \"k\": \"VoBG-oyqVoyCr9G56ozmq8n_rlDDyYMQOd_DO4GOkEY\",\n"
                    + "    \"kty\": \"oct\",\n"
                    + "    \"alg\": \"HS256\",\n"
                    + "}";
            JwtClaims claims = new JwtClaims();
            claims.setGeneratedJwtId();
            claims.setIssuedAtToNow();
            // Set the expiration time to less than 7 days.
            NumericDate date = NumericDate.now();
            date.addSeconds(120*60);
            claims.setExpirationTime(date);
            claims.setNotBeforeMinutesInThePast(1);
            // Add custom parameters. All values must be of the String type.
            // Set the consumer identifier.
            claims.setClaim("uid", "11215ac069234abcb8944232b79ae711");
            JsonWebSignature jws = new JsonWebSignature();
            // Set the encryption algorithm.
            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);
        }
    }

    Kod ayarları:

    • privateKeyJson: Tüketici oluştururken kullanılan JWKS. Tüketici oluşturma sırasında JWKS'yi kaydedin veya tüketici temel yapılandırma sayfasından alın.

    • Tüketici tanımlayıcısını ayarlayın. İfade şudur: claims.setClaim("uid", "11215ac069234abcb8944232b79ae711"). Bu tanımlayıcı, bir tüketici oluşturduğunuzda otomatik olarak oluşturulur ancak değiştirilebilir. Ayrıca tüketici temel yapılandırma sayfasından da alabilirsiniz.

    • Şifreleme algoritmasını ayarlayın. İfade şudur: jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256). Bu algoritma, JWKS'dekiyle eşleşmelidir.

      Not

      Desteklenen şifreleme algoritmaları arasında ES256, ES384, ES512, RS256, RS384, RS512, PS256, PS384, PS512, HS256, HS384, HS512 ve EdDSA bulunur.

      Simetrik şifreleme için "k" değerinin kodunun çözülmesi gerekir.

      jws.setKey(new HmacKey(Base64.decode(JsonUtil.parseJson(privateKeyJson).get("k").toString())));
    • Son kullanma süresini ayarlayın. Belirtecin son kullanma süresi yedi gün içinde olmalıdır. Süre dolduktan sonra yeni bir belirteç oluşturun.

      ...
          NumericDate date = NumericDate.now();
          date.addSeconds(120*60);
          claims.setExpirationTime(date);
          claims.setNotBeforeMinutesInThePast(1);
      ...
    • İhtiyaçlarınıza göre JWKS PAYLOAD'a özel parametreler ekleyebilirsiniz.

    Asimetrik anahtar

    Örnek kod:

    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 {
            // Sample key in JWK format.
            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(); // Automatically generate a JTI (JWT ID).
            claims.setIssuedAtToNow();  // Set the issued at time (iat) to the current time.
    
            // Set the expiration time to less than 7 days.
            NumericDate date = NumericDate.now();
            date.addSeconds(120 * 60); // Set expiration to 120 minutes from now.
            claims.setExpirationTime(date);
            claims.setNotBeforeMinutesInThePast(1); // Set the not before (nbf) time to 1 minute in the past.
    
            // Add custom parameters. All values must be of the String type.
            // Set the consumer identifier.
            claims.setClaim("uid", "11215ac069234abcb8944232b79ae711");
    
            JsonWebSignature jws = new JsonWebSignature();
            // Set the encryption algorithm to RSA-SHA256.
            jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
    
            // Parse the private key and set it in the signer.
            PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyJson)).getPrivateKey();
            jws.setKey(privateKey);
    
            // Set the payload content.
            jws.setPayload(claims.toJson());
    
            // Generate the JWT.
            String jwtResult = jws.getCompactSerialization();
            System.out.println("Generate Json Web token , result is \n " + jwtResult);
        }
    }
    

    Kod ayarları:

    • privateKeyJson, tüketici tanımlayıcısı ve son kullanma süresi ayarları simetrik şifrelemeye benzer.

      Şifreleme algoritmasını jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256) ifadesini kullanarak ayarlayın. Bu algoritma, JWKS'dekiyle eşleşmelidir.

      Asimetrik bir şifreleme algoritması için şifreleme amacıyla özel anahtarını kullanmanız gerekir.

      ...
          jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
          PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyJson)).getPrivateKey();
          jws.setKey(privateKey);
      ...
    • JWT'nin PAYLOAD kısmına özel parametreler ekleyebilirsiniz.

İş isteklerini gönderme

Cloud-native API Gateway, belirtecin bir istek üstbilgisinde iletilmesini destekler. Üstbilgi adını ve belirteç ön ekini özelleştirebilirsiniz. İstekteki anahtar ve ön ek, tüketicinin kimlik doğrulama yönteminde yapılandırılanlarla eşleşmelidir.

  • JWT içermeyen istekler 401 hatası döndürür.

    curl  http://xxx.hello.com/test
  • Geçersiz JWT içeren istekler 401 hatası döndürür.

    curl  http://xxx.hello.com/test -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ1'
  • Bir istek geçerli bir JWT içeriyorsa ancak tüketici API veya rota için yetkilendirilmemişse 403 hatası döndürülür.

    # consumer1 is not authorized for the route or API at the specified path.
    
    curl  'http://xxx.example.com/test' -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjEyMyJ9.eyJpc3MiOiJhYmNkIiwic3ViIjoidGVzdCIsImlhdCI6MTY2NTY2MDUyNywiZXhwIjoxODY1NjczODE5fQ.-vBSV0bKeDwQcuS6eeSZN9dLTUnSnZVk8eVCXdooCQ4'

Sunucu tarafında belirteç doğrulama

Belirteç doğrulama üç adımdan oluşur:

  1. İsteğin bir belirteç içerip içermediğini kontrol edin. İçermiyorsa 401 ile reddedin.

  2. Tüketicinin JWKS'sinden alınan genel anahtarı kullanarak belirtecin geçerliliğini ve son kullanma süresini doğrulayın. Geçersiz veya süresi dolmuşsa 401 ile reddedin.

  3. Tüketicinin istenen API'ye veya rotaya erişim yetkisi olup olmadığını kontrol edin.

Yaygın hata kodları


HTTP durum kodu


Hata mesajı


Açıklama


401


Jwt missing


JWT istek üstbilgisinde eksik.


401


Jwt expired


JWT'nin süresi doldu.


401


Jwt verification fails


JWT yükü doğrulaması başarısız oldu, örneğin iss uyuşmazlığı nedeniyle.


403


Access Denied


Mevcut rotaya erişim izni yok.

AK/SK (HMAC) kimlik doğrulaması

İstemci tarafında imza oluşturma

İstemci üç adımda bir imza oluşturur:

  1. İmzalanacak dizeyi çıkarın: İmzalama için orijinal istekten ana verileri çıkararak bir dize oluşturun.

  2. İmzayı oluşturun: İmzalanacak dizeyi SK ile şifreleyerek nihai imzayı üretin.

  3. İmzayı ekleyin: Orijinal HTTP isteğine imza ile ilgili tüm üstbilgileri ekleyerek nihai isteği oluşturun.

Adım 1: İmzalanacak dizeyi çıkarma

HTTP isteğinden ana verileri çıkarın ve aşağıdaki biçimde imzalanacak bir dize halinde birleştirin:

HTTPMethod
Accept
Content-MD5
Content-Type
Date
Headers
PathAndParameters

Bu yedi alan, yeni satır karakterleriyle (\n) ayrılarak imzalanacak dizeyi oluşturur. Headers alanı boşsa sonrasında yeni satır gerekmez. Diğer boş alanlar için yeni satır karakterini dahil edin. İmza büyük/küçük harfe duyarlıdır. Her alan aşağıdaki şekilde çıkarılır:

  • HTTPMethod: Büyük harfle yazılmış HTTP yöntemi. Örnek: POST.

  • Accept: Accept üstbilgisinin değeri. Boş olabilir. Accept üstbilgisini açıkça ayarlamanız önerilir. Boş bırakılırsa bazı HTTP istemcileri varsayılan olarak */* değerini atar ve bu durum imza doğrulamanın başarısız olmasına neden olur.

  • Content-MD5: Content-MD5 üstbilgisinin değeri. Boş olabilir. Yalnızca form dışı gövdesi olan istekler için hesaplayın. Aşağıdaki Java kodu Content-MD5 değerinin nasıl hesaplanacağını gösterir:

    String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));
  • Content-Type: Content-Type üstbilgisinin değeri. Boş olabilir.

  • Date: Date üstbilgisinin değeri. date_offset etkinleştirilmemişse boş olabilir. Aksi takdirde zaman kayması doğrulaması için kullanılır.

  • Headers: İmzaya dahil edilecek belirli üstbilgileri seçin. Bunları aşağıdaki şekilde birleştirin:

    • Üstbilgi anahtarlarını alfabetik olarak sıralayın ve birleştirin:

      HeaderKey1 + ":" + HeaderValue1 + "\n"\+
      HeaderKey2 + ":" + HeaderValue2 + "\n"\+
      ...
      HeaderKeyN + ":" + HeaderValueN + "\n"
    • Bir üstbilginin değeri boşsa imza için HeaderKey+":"+"\n" kullanın; anahtarı ve iki noktayı koruyun.

    • İmzalanan tüm üstbilgilerin anahtarlarını virgülle ayırarak X-Ca-Signature-Headers üstbilgisinde listeleyin.

    • Aşağıdaki üstbilgiler imza hesaplamasına dahil edilmez: X-Ca-Signature, X-Ca-Signature-Headers, Accept, Content-MD5, Content-Type ve Date.

  • PathAndParameters: Yolu, sorgu parametrelerini ve form parametrelerini içerir. Aşağıdaki şekilde oluşturulur:

    Path + "?" + Key1 + "=" + Value1 + "&" + Key2 + "=" + Value2 + ... "&" + KeyN + "=" + ValueN
    Önemli
    • Sorgu ve form parametre anahtarlarını birleştirmeden önce alfabetik olarak sıralayın.

    • Sorgu ve form parametreleri boşsa Path'i doğrudan ? olmadan kullanın.

    • Bir parametrenin değeri boşsa yalnızca anahtarı dahil edin. Eşittir işareti (=) dahil edilmez.

    • Sorgu veya form aynı anahtara sahip farklı değerlerden oluşan dizi parametreleri içeriyorsa imza hesaplaması için ilk değeri kullanın.

Adım 2: İmza oluşturma

Nihai imzayı üretmek için imzalanacak dizeyi şifreleyin ve kodlayın. Aşağıdaki örnekte stringToSign çıkarılan dize, secret AK/SK yapılandırmasındaki SK ve sign oluşturulan 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 değerini UTF-8 bayt dizisine dönüştürün, şifreleyin ve sonucu Base64 ile kodlayarak imzayı oluşturun.

Adım 3: İmzayı isteğe ekleme

İmza doğrulama için HTTP isteğine aşağıdaki dört üstbilgiyi dahil edin:

  • x-ca-key: AK/SK kimlik doğrulama yapılandırmasındaki AK.

  • x-ca-signature-method: İmza algoritması. Geçerli değerler HmacSHA256 veya HmacSHA1 değerleridir. Bu isteğe bağlıdır ve varsayılan olarak HmacSHA256 değerini alır.

  • x-ca-signature-headers: İmzaya dahil edilen tüm üstbilgi anahtarlarının virgülle ayrılmış listesi. Bu isteğe bağlıdır.

  • x-ca-signature: İmza. Bu gereklidir.

Sunucu tarafında imza doğrulama

Sunucu tarafında imza doğrulama şu şekilde çalışır:

  1. İmzalanacak dizeyi çıkarın: Alınan istekten ana verileri çıkararak imzalama için bir dize oluşturun.

  2. SK'yı alın: İstekten AK'yı okuyun ve buna karşılık gelen SK'yı almak için kullanın.

  3. İmzayı hesaplayın: Aynı şifreleme algoritmasını ve alınan SK'yı kullanarak imzalanacak dizeyi şifreleyin; bu işlem sunucu tarafı imzasını üretir.

  4. İmzayı doğrulayın: İstemci tarafı imzasını istekten okuyun ve eşleşme için sunucu tarafı imzasıyla karşılaştırın.

Sorun giderme

İmza doğrulama başarısız olduğunda sunucu, kendi imzalanacak dizesini (StringToSign) X-Ca-Error-Message yanıt üstbilgisinde döndürür. Sunucu tarafındaki StringToSign ile yerel olarak hesapladığınız dizeyi karşılaştırın. Eşleşiyorlarsa doğru SK'yı kullanıp kullanmadığınızı kontrol edin. HTTP üstbilgileri yeni satır karakterleri içeremediğinden StringToSign'deki yeni satırlar # ile 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`

İlgili hata kodları


HTTP durum kodu


Hata mesajı


Açıklama


401


Invalid Key


x-ca-key üstbilgisi eksik veya anahtar geçersiz.


401


Empty Signature


x-ca-signature üstbilgisi eksik.


400


Invalid Signature


x-ca-signature üstbilgisindeki imza, sunucu tarafından hesaplanan imzayla eşleşmiyor.


400


Invalid Content-MD5


Content-MD5 üstbilgisi yanlış.


400


Invalid Date


Date üstbilgisinden hesaplanan zaman kayması, yapılandırılmış date_offset değerini aşıyor.


413


Request Body Too Large


İstek gövdesi boyutu 32 MB sınırını aşıyor.


413


Payload Too Large


İstek gövdesi, genel olarak yapılandırılmış DownstreamConnectionBufferLimits değerini aşıyor.


403


Unauthorized Consumer


İsteği yapan yetkilendirilmemiş.

Örnek kod (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 {
		// If signature verification fails, the X-Ca-Error-Message response header
		// contains the server-side string to sign, which can be used for troubleshooting.
		fmt.Printf("  %s: %s\n", k, v)
	}
	respBody, _ := io.ReadAll(resp.Body)
	fmt.Println(string(respBody))
}
func main() {
	test("appKey", "appSecret")
}

API anahtarı kimlik doğrulaması

Ağ geçidi, yapılandırılmış kimlik bilgisi kaynağına göre istekleri kimlik doğrular. Süreç API'ler ve rotalar için benzerdir. Aşağıdaki örnekler rotaları kullanır.

API anahtarları için üç tür kimlik bilgisi kaynağı mevcuttur:

  1. Varsayılan kimlik bilgisi kaynağı: Authorization: Bearer <token>.

  2. Özel üstbilgi: Bir üstbilgi adı sağlayın.

  3. Özel sorgu parametresi: Bir sorgu parametresi adı sağlayın.

Varsayılan kimlik bilgisi kaynağı

Bir isteğin abc rotasıyla eşleştiğini varsayalım. API anahtarı, Bearer ön ekiyle (sondaki boşluğa dikkat edin) Authorization üstbilgisinde sağlanır.

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

API anahtarını istek üstbilgisinde ayarlama

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

Özel üstbilgi kaynağı

İsteğin abc rotasıyla eşleştiğini ve API anahtarının özel bir üstbilgide bulunduğunu varsayalım.

  • API anahtarı yanlış konumdaysa (örneğin, yapılandırılmış özel üstbilgi yerine bir sorgu parametresi olarak), istek 401 ile reddedilir.

    curl  http://xxx.test.com/test?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5
  • İlke etkinleştirilmiş ancak tüketici yetkilendirilmemişse istek 403 ile reddedilir.

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

Özel sorgu parametresi

İsteğin abc rotasıyla eşleştiğini ve API anahtarının bir URL parametresinde bulunduğunu varsayalım.

  • Rota için tüketici kimlik doğrulaması etkinleştirilmemişse istek 401 ile reddedilir.

    curl  http://xxx.test.com/test?apikey=2bda943c-ba2b-11ec-ba07-00163e1250b5
  • İlke etkinleştirilmiş ancak tüketici yetkilendirilmemişse istek 403 ile reddedilir.

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

İlgili hata kodları


HTTP durum kodu


Hata mesajı


Açıklama


401


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


İstekte birden çok API anahtarı sağlandı.


401


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


İstekte API anahtarı sağlanmadı.


401


Request denied by Key Auth check. Invalid API key.


Sağlanan API anahtarının erişimine izin verilmiyor.


403


Request denied by Key Auth check. Unauthorized consumer.


İsteği yapan yetkilendirilmemiş.

Başvurular

API'lerinizi Yetkilendirme yönetimi aracılığıyla yetkilendirebilir ve yönetebilirsiniz.