Script
Bu doküman spesifik bir politikanın detaylı kullanımını anlatır. Eğer Apinizer politika yapısını ilk kez kullanıyorsanız veya politikaların genel çalışma prensiplerini öğrenmek istiyorsanız, öncelikle Politika Nedir? sayfasını okumanızı öneririz.
Genel Bakış
Amacı Nedir?
- Script Politikası, API Proxy (API Vekil Sunucusu) istek hattında özel iş kuralları ve veri dönüşümleri uygulayarak entegrasyon gereksinimlerini kod yazmadan çözmeyi hedefler.
- Script Politikası, yanıt hattında gelen verileri maskeleme, zenginleştirme veya hata mesajlarını uyarlama gibi işlemleri merkezi olarak yönetmeyi sağlar.
- Script Politikası, farklı ortamlar arasında tutarlı davranış için global/local paylaşımlı script kütüphanesi oluşturmayı m ümkün kılar.
- Script Politikası, koşul motoru sayesinde yalnızca belirlenen endpoint veya header kombinasyonlarında devreye girerek performansı korur.
Çalışma Prensibi
- İstek Gelişi: API Gateway'e gelen her HTTP/HTTPS isteği için, istemin kaynak IP adresi tespit edilir.
- Politika Kontrolü: Script Politikası aktif ise, sistem aşağıdaki sırayla kontrol yapar:
- Condition (koşul) tanımlı mı? Varsa koşul sağlanıyor mu?
- Politika aktif mi (active=true)?
- Variable kullanılıyor mu yoksa Apinizer default mı?
- Script Motoru Yürütmesi: Seçilen executionType (SYNC/ASYNC) ve scriptLanguage (Groovy/Javascript) değerlerine göre script, belirlenen pipeline bölgesinde çalıştırılır; istek/yanıt body, header ve parametre haritaları güncellenebilir.
- Karar Verme:
- Eşleşme Var: Script sonucunda güncellenen mesaj bileşenleri pipeline'a geri yazılır, hata durumunda tanımlı statusCode ve mesaj döner.
- Eşleşme Yok: Script atlanır, istek/yanıt varsayılan akışına devam eder.
- Hata İşleme: Politika kuralına uymayan istekler için özelleştirilebilir HTTP durum kodu ve hata mesajı döndürülür.
Özellikler ve Yetenekler
Temel Özellikler
- ExecutionType Yönetimi (Sync/Async): Scriptin eşzamanlı mı yoksa arka planda mı yürütüleceğini belirler; asenkron mod uzun süren işlemlerde uç noktayı bloklamaz.
- Çift Script Dili Desteği: Groovy ve Javascript arasında seçim yaparak ekiplerin hâkim oldukları dili kullanmalarını sağlar.
- Bağlam Değişkeni Kütüphanesi: From Client, To Backend, From Backend ve To Client akışları için hazır değişken haritaları sunar; okunabilir/yazılabilir alanlar net olarak ayrılmıştır.
- Aktif/Pasif Durum Kontrolü: Politikanın aktif veya pasif durumunu kolayca değiştirme (active/passive toggle). Pasif durumda politika uygulanmaz ancak yapılandırması saklanır.
- Koşul Bazlı Uygulama: Query Builder ile karmaşık koşullar oluşturarak politikanın ne zaman uygulanacağını belirleme (örn: sadece belirli endpoint'lere veya header değerlerine göre).
İleri Düzey Özellikler
- Script Test Laboratuvarı: Entegre test penceresiyle farklı pipeline segmentleri için örnek header/param/body verileriyle script çalıştırma ve sonucu inceleme.
- Bağımlılık İzleme: Used Proxies/Policy Groups bölümleriyle politikanın hangi API Proxy veya gruplarda kullanıldığını görüp değişiklik etki analizi yapma.
- Dinamik Context Value Seçimi: EnumScriptContextValue üzerinden tarih, ortam veya proxy metadata bilgilerini script içerisinde kullanmak için otomatik kopyalama.
- Export/Import Özelliği: Politika yapılandırmasını ZIP dosyası olarak export etme. Farklı ortamlara (Development, Test, Production) import etme. Versiyon kontrolü ve yedekleme imkanı.
- Policy Group ve Proxy Group Desteği: Birden fazla politikayı Policy Group içinde yönetme. Proxy Group'lara toplu politika atama. Merkezi güncelleme ve deploy işlemleri.
- Deploy ve Versiyonlama: Politika değişikliklerini canlı ortama deploy etme. Hangi API Proxy'lerde kullanıldığını görme (Policy Usage). Proxy Group ve Policy Group kullanım raporları.
Kullanım Senaryoları
| Senaryo | Durum | Çözüm (Politika Uygulaması) | Beklenen Davranış / Sonuç |
|---|---|---|---|
| İstek Başlığı Enjeksiyonu | Dış sistem ek header talep ediyor | From Client → To Backend scriptinde requestHeaderMapToTargetAPI ile header eklenir | Backend çağrısı gereken header ile yapılır |
| Hassas Alan Maskesi | Yanıtta TC kimlik numarası bulunuyor | To Client scriptinde regex ile hassas alan maskelenir | İstemciye maskelenmiş veri döner |
| Dinamik Endpoint Yönlendirme | Bazı müşteriler farklı backend URL'sine yönlendirilmeli | Script requestBackendUrlToTargetAPI alanını koşula göre set eder | İstek uygun hedef servise yönlenir |
| Koşullu Hata Dönüşü | Belirli API anahtarlarında erişim durdurulmalı | Script responseErrorMessageToClient ve statusCodeToClient=403 atar | İstemci 403 ve özelleştirilmiş mesaj alır |
| JWT Enrichment | JWT claim değerine dayalı context üretmek gerekiyor | Script claim'i okuyup customVariableMap'e yazar | Sonraki politikalar enriched değeri kullanır |
Politika Parametrelerini Yapılandırma
Bu adımda, kullanıcı yeni bir politika oluşturabilir ya da mevcut politika parametrelerini yapılandırarak erişim kurallarını belirleyebilir.
Yeni Script Politikası Oluşturma
Yapılandırma Adımları
Adım 1: Oluşturma Sayfasına Gitme
Sol menüden Development → Global Settings → Global Policies → Script Politikası bölümüne gidin ve sağ üstteki [+ Create] butonuna tıklayın.
Adım 2: Temel Bilgileri Girme
Policy Status (Politika Durumu): Aktif/Pasif durumu gösterir. Yeni politikalar varsayılan olarak aktiftir.
Name (İsim) - Zorunlu: Benzersiz isim girin (örnek: Production_ScriptPolicy). Sistem otomatik kontrol eder. Yeşil tik: kullanılabilir, Kırmızı çarpı: mevcut isim.
Description (Açıklama): Politikanın amacını açıklayın (Maks. 1000 karakter). Örnek: "İstek hattında kampanya header'ı ekler."
Adım 3: Variable Kullanımı
- Sayfanın üst kısmındaki işlem butonları alanında, [<> Variable] butonunu kullanarak dinamik değer seçebilirsiniz.
- Context/global variable ifadeleri sayesinde politika parametrelerini sabit değer yerine değişken tabanlı yönetebilirsiniz.
- Bu kullanım, değişen değerlerde manuel güncelleme ihtiyacını azaltır ve operasyonel kolaylık sağlar.
- Detaylı bilgi için Dinamik Değişkenler sayfasını inceleyebilirsiniz.
Adım 4: ExecutionType Seçimi
Execution Type bölümünde Sync veya Async seçin:
Syncseçildiğinde script gateway pipeline'ında eşzamanlı yürürAsync, uzun süren operasyonlarda istemciyi bekletmemek için uygun olup yan kanal tetikler
Adım 5: Script Dili Yapılandırması
Script Language altında Javascript veya Groovy seçin. Seçim kod editörünün sözdizimini ve IntelliSense'i belirler.
Adım 6: Script Gövdesi ve Değişken Yönetimi
- Kod editörüne scriptinizi yazın veya yapıştırın
- Değişken etiketlerinden requestHeaderMapToTargetAPI, responseBodyTextToClient gibi alanları bir tıklamayla panoya kopyalayın
- customVariableMap üzerinden diğer politikalara veri aktarabilirsiniz
- Dene (Try it) düğmesiyle Script'i Test Etme penceresini açın ve script'i örnek veriyle çalıştırın. Apinizer hiçbir şeyi kaydetmez ve backend'i çağırmaz.
Adım 7: Koşul Tanımlama (İsteğe Bağlı)
Condition sekmesine geçin. Koşullar, politikanın hangi durumda aktif olacağını belirler.
Örnekler:
- Ortam bazlı:
Header = X-Environment, Operator = Equals, Value = production - API Key bazlı:
Header = X-API-Key, Starts With = PROD- - Endpoint bazlı:
Path = /api/admin/*
Koşul tanımlamazsa politika her zaman aktif olur.
Detaylar için bakabilirsiniz: Koşullar (Conditions)
Adım 8: Hata Mesajı Özelleştirme (İsteğe Bağlı)
Error Message Customization sekmesine gidin ve erişim reddedildiğinde dönecek mesajı özelleştirin.
Varsayılan:
{ "statusCode": 403, "message": "[Default hata mesajı]" }
Özel:
{ "statusCode": 403, "errorCode": "[CUSTOM_ERROR_CODE]", "message": "[Özel mesaj]" }
Adım 9: Kaydetme
Sağ üstteki [Save] butonuna tıklayın.
Kontrol Listesi:
- Benzersiz isim
- Zorunlu alanlar dolu
- En az bir script gövdesi satırı mevcut
Sonuç:
- Politika listeye eklenir
- API'lere bağlanabilir
- Global politikaysa otomatik uygulanır
Koşullar ve Hata Mesajı Özelleştirme panellerinin açıklaması için Politika Nedir? sayfasındaki Koşullar ve Hata Mesajı Özelleştirme (Error Message Customization) bölümlerini inceleyebilirsiniz.
Hata mesajı yapılandırmasının tüm katmanları, öncelik sırası ve senaryo örnekleri için Hata Mesajı Yapılandırma Rehberi sayfasına bakın.
Flow Variables (Akış Değişkenleri)
Script Politikası içerisinde kullanabileceğiniz akış değişkenleri ve özellikleri aşağıdaki tablolarda detaylı olarak açıklanmıştır.
İstek Değişkenleri (Client → Apinizer)
| Değişken Adı | Pipeline | Yön | Tip | Erişim | Açıklama | Örnek Kullanım |
|---|---|---|---|---|---|---|
| requestHeaderMapFromClient | İstek | Client → Apinizer | Map<String, String> | Okuma | İstemciden gelen istek Apinizer'a ulaştığı andaki orijinal halinin başlık(header) değerlerine erişmek için kullanılır. | String value= requestHeaderMapFromClient.get("Content-Type"); |
| requestUrlParamMapFromClient | İstek | Client → Apinizer | Map<String, String> | Okuma | İstemciden gelen istek Apinizer'a ulaştığı andaki orijinal halinin sorgu(query) parametre değerlerine erişmek için kullanılır. | String value= requestUrlParamMapFromClient.get("param"); |
| requestBodyTextFromClient | İstek | Client → Apinizer | String | Okuma | İstemciden gelen istek Apinizer'a ulaştığı andaki orijinal halinin gövde değerine erişmek için kullanılır. | String value= requestBodyTextFromClient; |
| requestUrlFromClient | İstek | Client → Apinizer | String | Okuma | İstemciden gelen isteğin karşılandığı endpoint yolunu içerir (örn. /pet/findByStatus). SOAP tipi API Proxy'lerde bu değişkenin değeri SOAP metodunun adıdır. | String value= requestUrlFromClient; |
| requestFormUrlEncodedListFromClient | İstek | Client → Apinizer | List<BasicNameValuePair> | Okuma | İstemciden gelen istek Apinizer'a ulaştığı andaki orijinal halinin "Form-URL-Encoded" parametrelerine erişmek için kullanılır. | Detaylı örnek için Form URL-Encoded Kullanımı bölümüne bakınız. |
| requestFormDataListFromClient | İstek | Client → Apinizer | List<ApinizerRequestBodyPart> | Okuma | İstemciden gelen istek Apinizer'a ulaştığı andaki orijinal halinin "Form-Data" parametrelerine erişmek için kullanılır. | Detaylı örnek için Form Data Kullanımı bölümüne bakınız. |
İstek Değişkenleri (Apinizer → Backend API)
| Değişken Adı | Pipeline | Yön | Tip | Erişim | Açıklama | Örnek Kullanım |
|---|---|---|---|---|---|---|
| requestHeaderMapToTargetAPI | İstek | Apinizer → Backend API | Map<String, String> | Okuma, Yazma | Apinizer'dan Backend API'ye giden isteğin başlık(header) değerlerine erişmek için kullanılır. Bu alandaki değerler istek hattındaki yapılan değişikleri içerir ve değerleri Apinizer'e gelen orijinal istekten farklılaşabilir. | String value= requestHeaderMapToTargetAPI.get("Content-Type");requestHeaderMapToTargetAPI.put("Content-Type","application/json"); |
| requestUrlParamMapToTargetAPI | İstek | Apinizer → Backend API | Map<String, String> | Okuma, Yazma | Apinizer'dan Backend API'ye giden isteğin sorgu(query) parametresindeki değerlerine erişmek için kullanılır. Bu alandaki değerler istek hattındaki yapılan değişikleri içerir ve değerleri Apinizer'e gelen orijinal istekten farklılaşabilir. | String value= requestUrlParamMapToTargetAPI.get("param");requestHeaderMapToTargetAPI.put("param","value"); |
| requestBodyTextToTargetAPI | İstek | Apinizer → Backend API | String | Okuma, Yazma | Apinizer'dan Backend API'ye giden isteğin gövde değerine erişmek için kullanılır. Bu alandaki değer istek hattındaki yapılan değişikleri içerir ve değeri Apinizer'e gelen orijinal istekten farklılaşabilir. | String value= requestBodyTextToTargetAPI;requestBodyTextToTargetAPI= "<body>"; |
| requestFormUrlEncodedListToTargetAPI | İstek | Apinizer → Backend API | List<BasicNameValuePair> | Okuma, Yazma | Apinizer'dan Backend API'ye giden isteğin "Form-Url Encoded" parametrelerindeki değerlerine erişmek için kullanılır. Bu alandaki değerler istek hattındaki yapılan değişikleri içerir ve değerleri Apinizer'e gelen orijinal istekten farklılaşabilir. | Detaylı örnek için Form URL-Encoded Kullanımı bölümüne bakınız. |
| requestFormDataListToTargetAPI | İstek | Apinizer → Backend AP | List<ApinizerRequestBodyPart> | Okuma, Yazma | Apinizer'dan Backend API'ye giden isteğin "Form-Data" parametrelerindeki değerlerine erişmek için kullanılır. Bu alandaki değerler istek hattındaki yapılan değişikleri içerir ve değerleri Apinizer'e gelen orijinal istekten farklılaşabilir. | Detaylı örnek için Form Data Kullanımı bölümüne bakınız. |
| requestErrorMessageToTargetAPI | İstek | Apinizer → Backend API | String | Yazma | İstek hattında akış kesilerek istemciye mesaj dönülmek isteniyorsa, dönülecek olan mesaj bu değişkene girilir. Script'in işletilmesi sonucu bu mesajın dolu olması halinde akış kesilerek istemciye bu değer döndürülür. | requestErrorMessageToTargetAPI= "<body>"; |
| statusCodeToTargetAPI | İstek | Apinizer → Backend API | Integer | Yazma | İstek hattında akış kesilerek istemciye mesaj dönülmek isteniyorsa, dönülecek olan durum kodu bu değişkene girilir. Tek başına bu değerin girilmesi akışın durdurulması için yeterli değildir, akışın durdurulması için requestErrorMessageToTargetAPI değerinin dolu olması gerekir. | statusCodeToTargetAPI=500; |
| requestBackendUrlToTargetAPI | İstek | Apinizer → Backend API | String | Yazma | Backend API URL'sinin bağlam yolu değiştirilmek istenirse bu alan kullanılabilir. Bu değişkenin varsayılan değeri boştur ve bu değişkene bir değer ayarlanırsa hedef bağlam yolu bu değerle değiştirilir. requestBackendUrlToTargetAPI değerinin boş olabilmesi için #EMPTY# değeri girilmelidir. Bu değer kullanıldığında, istek herhangi bir path veya query eklenmeden doğrudan routing adresine yönlendirilmesi sa ğlandı. | Detaylı örnekler için Backend URL Değiştirme bölümüne bakınız. |
Yanıt Değişkenleri (Backend API → Apinizer)
| Değişken Adı | Pipeline | Yön | Tip | Erişim | Açıklama | Örnek Kullanım |
|---|---|---|---|---|---|---|
| responseHeaderMapFromTargetAPI | Yanıt | Backend API → Apinizer | Map<String, String> | Okuma | Backend API'den dönen sonuç Apinizer'a ulaştığı andaki orijinal halinin başlık(header) değerlerine erişmek için kullanılır. | String value= responseHeaderMapFromTargetAPI.get("Content-Type"); |
| responseBodyTextFromTargetAPI | Yanıt | Backend API → Apinizer | String | Okuma | Backend API'den dönen sonuç Apinizer'a ulaştığı andaki orijinal halinin gövde değerine erişmek için kullanılır. | String value= responseBodyTextFromTargetAPI; |
| statusCodeFromTargetAPI | Yanıt | Backend API → Apinizer | Integer | Okuma | Backend API'den dönen sonuç Apinizer'a ulaştığı andaki orijinal halinin durum kodu değerine erişmek için kullanılır. | int value=statusCodeFromTargetAPI; |
Yanıt Değişkenleri (Apinizer → Client)
| Değişken Adı | Pipeline | Yön | Tip | Erişim | Açıklama | Örnek Kullanım |
|---|---|---|---|---|---|---|
| responseHeaderMapToClient | Yanıt | Apinizer → Client | Map<String, String> | Okuma, Yazma | Apinizer'dan İstemciye dönen yanıtın başlık(header) değerlerine erişmek için kullanılır. Bu alandaki değerler yanıt hattındaki yapılan değişikleri içerir ve değerleri Apinizer'e dönen orijinal yanıttan farklılaşabilir. | String value= responseHeaderMapToClient.get("Content-Type");responseHeaderMapToClient.put("Content-Type","application/json"); |
| responseBodyTextToClient | Yanıt | Apinizer → Client | String | Okuma, Yazma | Apinizer'dan İstemciye dönen yanıtın gövde değerine erişmek için kullanılır. Bu alandaki değer yanıt hattındaki yapılan değişikleri içerir ve değeri Apinizer'e dönen orijinal yanıttan farklılaşabilir. | String value= responseBodyTextToClient;responseBodyTextToClient= "<body>"; |
| responseErrorMessageToClient | Yanıt | Apinizer → Client | String | Okuma, Yazma | Yanıt hattında akış kesilerek istemciye mesaj dönülmek isteniyorsa, dönülecek olan mesaj bu değişkene girilir. Script'in işletilmesi sonucu bu mesajın dolu olması halinde akış kesilerek istemciye bu değer döndürülür. | responseErrorMessageToClient= "<body>"; |
| statusCodeToClient | Yanıt | Apinizer → Client | Integer | Okuma, Yazma | Yanıt hattında akış kesilerek istemciye mesaj dönülmek isteniyorsa, dönülecek olan durum kodu bu değişkene girilir. Tek başına bu değerin girilmesi akışın durdurulması için yeterli değildir, akışın durdurulması için responseErrorMessageToClient değerinin dolu olması gerekir. | int value=statusCodeToClient;statusCodeToClient=401; |
| stopFlowAsSuccess | İstek / Yanıt | Script → Apinizer | boolean | Yazma | Akış kesilerek istemciye mesaj dönüldüğünde, sonucun başarılı olarak işaretlenmesini sağlar. Değeri true yapılırsa istek trafik loglarında resultType=SUCCESS olarak görünür, analitik raporlarda hata/bloke sayılmaz ve durum kodu yazılmadıysa HTTP 200 döner (varsayılan davranışta 401 dönerdi). Durum kodu istisnası: yanıt hattında arka uç servis 4xx/5xx döndürmüşse o durum kodu korunur, 200'e çevrilmez — yalnızca sonuç tipi SUCCESS olur. Arka ucun hata kodunu da maskelemek istiyorsanız statusCodeToClient değişkenine dönmek istediğiniz kodu açıkça yazın; script'in yazdığı durum kodu her zaman önceliklidir. Bu değişken tek başına akışı kesmez — akışın kesilmesi için yine responseErrorMessageToClient (yanıt hattı) veya requestErrorMessageToTargetAPI (istek hattı) değerinin dolu olması gerekir. Yazılmadığında davranış değişmez, sonuç BLOCKED olarak işaretlenir. | responseErrorMessageToClient= "{\"status\":\"ok\"}";stopFlowAsSuccess= true; |
Detaylı Kullanım Örnekleri
Form URL-Encoded Kullanımı
import org.apache.http.message.BasicNameValuePair
String selectedValue;
for (BasicNameValuePair nameValuePair : requestFormUrlEncodedListFromClient) {
if("test".equals(nameValuePair.getName())){
selectedValue=nameValuePair.getValue();
}
}
Form Data Kullanımı
import com.apinizer.common.global.apinizerrequest.*;
for (ApinizerRequestBodyPart bodyPart : requestFormDataListFromClient) {
if(bodyPart.getBodyPartType().isText()){
ApinizerRequestTextBody textBodyPart = ((ApinizerRequestTextBody)bodyPart));
String text=textBodyPart.getText();
//do some logic
}else{//bodyPart.getBodyPartType().isBinary()
ApinizerRequestBinaryBody binaryBodyPart = ((ApinizerRequestBinaryBody)bodyPart));
byte[] byteArr=binaryBodyPart.getContent();
String fileName=binaryBodyPart.getFileName();
//do some logic
}
}
Backend URL Değiştirme
Örnek Senaryo:
Mevcut routing adresi: "https://apinizer.com/api" olsun,
Gelen istek kapsam yolu: "/findByStatus?param=value" olsun.
Bu durumda istek şu adrese gider: "https://apinizer.com/api/findByStatus?param=value"
Aşağıdaki kod yazıldığında:
requestBackendUrlToTargetAPI="/new/path/value?p=v";
İstek şu adrese gider: "https://apinizer.com/api/new/path/value?p=v"
Aşağıdaki kod yazıldığında:
requestBackendUrlToTargetAPI="#EMPTY#"
İstek şu adrese gider: "https://apinizer.com/api"
Ortam Değişkenlerine Erişim
Script gövdesi içinde ${değişken} ifadesi çözülmez (Groovy'de GString olarak algılanır, JavaScript'te şablon değişmezi olarak yorumlanır). Ortam değişkenlerine script içinden erişmek için environmentVariableMap kullanılır.
String dbHost = environmentVariableMap.get("dbHost");
String apiKey = environmentVariableMap.get("apiKey");
if (environmentVariableMap.containsKey("featureFlag")) {
// değişken tanımlı, kullan
}
Davranış:
- Map salt-okunurdur;
put,remove,clearçağrılarıUnsupportedOperationExceptionfırlatır. - Iteration desteklenir:
keySet(),values(),entrySet()çağrılarak aktif ortamdaki tüm değişken isimleri/değerleri keşfedilebilir. - Aktif ortam üzerinden çalışır; her script çalıştırılışında o anki aktif ortamın değerleri okunur.
- Gizli (Secret) olarak işaretlenmiş değerler çözülmüş plain değer olarak döner.
- Büyük/küçük harf duyarsız:
get("dbHost"),get("DBHOST"),get("dbhost")aynı değeri döner.
// Discovery örneği — aktif ortamdaki tüm değişkenleri logla
environmentVariableMap.keySet().each { name ->
request_log("env: " + name + " = " + environmentVariableMap.get(name));
}
Credential Bilgilerine Erişim
Mevcut credential_* değişkenleri yalnızca isteğin doğrulanmış credential'ını verir. Başka bir credential'a kullanıcı adı veya istemci kimliği ile erişmek için credentialMap kullanılır.
Örnek 1 — Basic Auth başlığı oluşturma (çözülmüş parola)
def cred = credentialMap.get("acme-app");
if (cred != null) {
String token = cred.getUsername() + ":" + cred.getResolvedPassword();
String header = "Basic " + Base64.getEncoder().encodeToString(token.getBytes());
requestHeaderMapToTargetAPI.put("Authorization", header);
}
Örnek 2 — JWT imzalama (private key)
def cred = credentialMap.get("jwt-signer");
java.security.PrivateKey privateKey = cred?.getPrivateKey();
// privateKey ile JWT imzala...
Örnek 3 — mTLS için keystore yükleme
def cred = credentialMap.get("backend-mtls");
java.security.KeyStore ks = cred?.getKeyStore();
// ks'i SSLContext'e bağla...
Örnek 4 — JWE şifre çözme için JWK
def cred = credentialMap.get("jwe-recipient");
def jwk = cred?.getJwkForDecryptionAndEncryption();
// jwk ile şifre çöz...
Örnek 5 — Doğrulanmış kullanıcının credential'ı
def me = credentialMap.get(request_usernameOrKey);
String myEmail = me?.getEmail();
String myOrg = me?.getOrganizationName();
Örnek 6 — Özel metadata okuma
def cred = credentialMap.get("acme-app");
Map<String, String> meta = cred?.getMetadata();
String tenantId = meta?.get("tenant_id");
String department = meta?.get("department");
Erişilebilen alanlar (credentialMap.get(...) dönen nesnesi üzerinden):
- Temel:
getUsername(),getEmail(),getFullName(),getDescription() - Parola:
getResolvedPassword()(şifresi çözülmüş; parola değerinde${değişken}ifadesi varsa yerine geçer),getEnvironmentPassword("ortam-id")(ortam-bazlı çözülmüş parola) - Kimlik metadata:
getOrganizationId(),getOrganizationName(),getProjectId(),getProjectName(),getAppId(),getAppName() - Yetki ve durum:
getRoleNameList(),getEnabled(),isExternal(),getExpireDate(),getGrantType() - Anahtar materyali:
getSecretKey(),getCertificate(),getPublicKey(),getPrivateKey(),getKeyStore(),getTrustStore(),getJwkForValidationAndSign(),getJwkForDecryptionAndEncryption() - Anahtar kimlikleri:
getSecretKeyId(),getCertificateId(),getPublicKeyId(),getPrivateKeyId(),getKeyStoreId(),getTrustStoreId() - Özel metadata (credential ve organizasyonu üzerinde tanımlı anahtar/değer çiftleri):
getMetadata()(organizasyon + credential girdileri birleşik, anahtar çakışmasında credential öncelikli; değerler çözülür ve şifresi açılır),getCredentialMetadata()(yalnızca credential seviyesi),getOrganizationMetadata()(yalnızca organizasyon seviyesi) — her biri salt-okunurMap<String, String>döner
Null kontrolü: credentialMap.get("...") çağrısı, credential bulunamazsa null döner. Null değer üzerinde getter çağrısı hata oluşturur — Groovy'de ?. operatörü veya açık if (cred != null) kontrolü kullanılmalıdır.
Anahtar listesi çıkarma engellidir: credentialMap.keySet(), values(), entrySet() çağrıları hata fırlatır. Yalnızca bilinen bir kullanıcı adı / istemci kimliği ile lookup desteklenir.
Güvenlik: Script politikasını oluşturma yetkisi, bu yöntem ile tüm credential'ların çözülmüş parolasına ve anahtar materyaline erişim yetkisi anlamına gelir. Bu yetkiyi atarken, kullanıcının ilgili credential'ları görüntüleme yetkisine sahip olduğundan emin olun.
Önemli Notlar
Script tipi Groovy ise:
- Mesaj gövdesi JSON olan durumda JsonSlurper,
- Mesaj gövdesi XML olan durumda XMLSlurper
kullanılması, mesaj işleme işlemini oldukça kolaylaştırır.
Hata mesajı değişkenleri ile istek bloke olduğunda istemciye, hata mesajı olarak Hata Yanıt Şablonu (Error Message Template) yerine bu değişkenin değerine ne yazıldıysa o dönmektedir.
Message Variables (Mesaj Değişkenleri)
Script Politikası içerisinde kullanabileceğiniz mesaj değişkenleri ve özellikleri aşağıdaki tablolarda detaylı olarak açıklanmıştır.
İstek Hattı Değişkenleri
| Akış Değişkenleri | Sahip Olduğu Değerin Yeri | Veri Tipi | İzin Verilen İşlem | Açıklama | Örnek Kullanım |
|---|---|---|---|---|---|
| request_remoteAddress | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Remote Address" değerine erişmek için kullanılır. | String value= request_remoteAddress;request_remoteAddress= "<new value>"; |
| request_httpMethod | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "HTTP Method" değerine erişmek için kullanılır. | String value= request_httpMethod;request_httpMethod= "<new value>"; |
| request_contentType | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Content Type" değerine erişmek için kullanılır. | String value= request_contentType;request_contentType= "<new value>"; |
| request_pathInfo | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Path Info" değerine erişmek için kullanılır. | String value=request_pathInfo ;request_pathInfo= "<new value>"; |
| request_contextPath | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Context Path" değerine erişmek için kullanılır. | String value= request_contextPath;request_contextPath= "<new value>"; |
| request_queryString | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Query String" değerine erişmek için kullanılır. | String value= request_queryString;request_queryString= "<new value>"; |
| request_remoteUser | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Remote User" değerine erişmek için kullanılır. | String value= request_remoteUser;request_remoteUser= "<new value>"; |
| request_usernameOrKey | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Username veya API Key" değerine erişmek için kullanılır. Bu değer Apinizer üzerindeki bir güvenlik politikası ile doğrulanmış ise Apinizer tarafından bu değer atanır, veya veri manipülasyon politikaları ile de manuel olarak değer atanabilir. | String value= request_usernameOrKey;request_usernameOrKey= "<new value>"; |
| request_requestedSessionId | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Requested Session Id" değerine erişmek için kullanılır. | String value= request_requestedSessionId;request_requestedSessionId= "<new value>"; |
| request_requestURI | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Request URI" değerine erişmek için kullanılır. | String value= request_requestURI;request_requestURI= "<new value>"; |
| request_characterEncoding | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Character Encoding" değerine erişmek için kullanılır. | String value= request_characterEncoding;request_characterEncoding= "<new value>"; |
| request_charset | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Charset" değerine erişmek için kullanılır. | String value= request_charset;request_charset= "<new value>"; |
| request_contentLength | Client → Apinizer | String | Okuma, Yazma | İstemciden gelen istekteki "Content Length" değerine erişmek için kullanılır. | String value= request_contentLength;request_contentLength= "<new value>"; |
| request_protocol | Client → Apinizer | String | Okuma, Yazma |