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 |
. |
|
|
Kimlik doğrulama yöntemi yapılandırması (JWT kimlik doğrulama örneği) |
|
|
|
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.
|
|
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ışı
İstemci, genellikle son kullanıcının kullanıcı adı ve parolasıyla ağ geçidine bir kimlik doğrulama isteği gönderir.
Ağ geçidi isteği arka uç hizmetine iletir.
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.
Ağ geçidi belirteci istemciye döndürür. İstemci bu belirteci yerel olarak önbelleğe alır.
İstemci, önbelleğe alınan belirteçle birlikte bir iş isteğini ağ geçidine gönderir.
Ağ geçidi, yapılandırılmış genel anahtarı kullanarak belirteci doğrular. Belirteç geçerliyse ağ geçidi isteği arka uca iletir.
Arka uç isteği işler ve bir yanıt döndürür.
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.
-
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> -
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.NotDesteklenen ş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
PAYLOADkı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:
İsteğin bir belirteç içerip içermediğini kontrol edin. İçermiyorsa 401 ile reddedin.
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.
Tüketicinin istenen API'ye veya rotaya erişim yetkisi olup olmadığını kontrol edin.
Yaygın hata kodları
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AK/SK (HMAC) kimlik doğrulaması
İstemci tarafında imza oluşturma
İstemci üç adımda bir imza oluşturur:
İmzalanacak dizeyi çıkarın: İmzalama için orijinal istekten ana verileri çıkararak bir dize oluşturun.
İmzayı oluşturun: İmzalanacak dizeyi SK ile şifreleyerek nihai imzayı üretin.
İ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 koduContent-MD5değ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_offsetetkinleş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-TypeveDate.
-
-
PathAndParameters: Yolu, sorgu parametrelerini ve form parametrelerini içerir. Aşağıdaki şekilde oluşturulur:
Path + "?" + Key1 + "=" + Value1 + "&" + Key2 + "=" + Value2 + ... "&" + KeyN + "=" + ValueNÖnemliSorgu 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ğerlerHmacSHA256veyaHmacSHA1değerleridir. Bu isteğe bağlıdır ve varsayılan olarakHmacSHA256değ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:
İmzalanacak dizeyi çıkarın: Alınan istekten ana verileri çıkararak imzalama için bir dize oluşturun.
SK'yı alın: İstekten AK'yı okuyun ve buna karşılık gelen SK'yı almak için kullanın.
İmzayı hesaplayın: Aynı şifreleme algoritmasını ve alınan SK'yı kullanarak imzalanacak dizeyi şifreleyin; bu işlem sunucu tarafı imzasını üretir.
İ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ı
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ö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:
Varsayılan kimlik bilgisi kaynağı:
Authorization: Bearer <token>.Özel üstbilgi: Bir üstbilgi adı sağlayın.
Ö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ı
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Başvurular
API'lerinizi Yetkilendirme yönetimi aracılığıyla yetkilendirebilir ve yönetebilirsiniz.