API Kimlik Doğrulama
Aşağıdaki örnekler en yaygın üç stratejiyle başlar: Bearer token, Basic auth ve OAuth2 client credentials. ApiAuth ayrıca header/query API anahtarı, HMAC, OAuth2 password ve sınırlı bir digest yer tutucusu sağlar.
Bearer Token
ApiClient.get("/api/me")
.auth(ApiAuth.bearerToken("my-secret-token"))
.send();
Basic Auth
ApiClient.get("/api/admin")
.auth(ApiAuth.basicAuth("admin", "password"))
.send();
OAuth2 — Client Credentials
Token, ilk kullanımda otomatik olarak alınır ve son kullanma süresine kadar önbelleğe alınır. Manuel token yenilemeye gerek yoktur.
ApiClient.setGlobalAuth(ApiAuth.oauth2(
"https://auth.example.com/token",
System.getenv("CLIENT_ID"),
System.getenv("CLIENT_SECRET")
));
Framework, grant_type=client_credentials ile bir POST gönderir ve dönen access_token değerini son kullanma süresine kadar (yanıttaki expires_in alanını kullanarak) önbelleğe alır.
Ek ApiAuth Fabrikaları
ApiAuth.apiKey("X-Api-Key", System.getenv("API_KEY"));
ApiAuth.apiKeyQuery("api_key", System.getenv("API_KEY"));
ApiAuth.hmac(System.getenv("API_KEY"), System.getenv("API_SECRET"), "HmacSHA256");
ApiAuth.oauth2Password(tokenUrl, clientId, clientSecret, username, password);
ApiAuth.digest(username, password) yalnızca Digest önekiyle Basic benzeri bir payload gönderir; RFC challenge/response akışını uygulamaz. Tam Digest kimlik doğrulaması için özel interceptor kullanın. HMAC fabrikası API anahtarı değerini imzalayıp X-Api-Key ve X-Signature ekler; genel amaçlı istek-gövdesi imzalama mekanizması değildir.
Global Auth — Her Test İçin Ayarla
Kimlik doğrulamayı her test için @BeforeMethod içinde ayarlayın. Global auth thread-local test kapsamındadır ve test kapanışında temizlenir; suite genelinde paylaşılmaz. Paralel testlerin her biri kendi auth ayarını kurmalıdır. Test içindeki her istekte .auth() çağrısı gerekmez.
import io.testfly.test.BaseApiTest;
import io.testfly.client.ApiAuth;
import io.testfly.client.ApiClient;
import io.testfly.client.ApiResponse;
import java.util.Map;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class UserApiTest extends BaseApiTest {
@BeforeMethod
public void authenticate() {
ApiResponse login = ApiClient.post("/api/auth/login")
.body(Map.of("username", "admin", "password", "pass"))
.send();
ApiClient.setGlobalAuth(ApiAuth.bearerToken(login.json("$.token")));
}
@Test
public void getUsers() {
// Token applied automatically — no .auth() needed
ApiClient.get("/api/users").send().assertStatus(200);
}
}
Framework, global kimlik doğrulamayı her testten sonra otomatik olarak temizler; böylece testler birbirine karışmaz.
Manuel olarak temizlemek için:
ApiClient.clearGlobalAuth();
@UseAuth — Yapılandırma Tabanlı Kimlik Doğrulama Stratejileri
testfly.yml içinde adlandırılmış kimlik doğrulama stratejileri tanımlayın ve bunları @UseAuth ile test bazında veya sınıf bazında uygulayın.
Yapılandırma
api:
auth:
adminToken:
type: bearer
token: ${ADMIN_TOKEN} # resolved from environment variable
basicUser:
type: basic
username: user
password: ${USER_PASSWORD}
serviceAccount:
type: oauth2
tokenUrl: https://auth.example.com/token
clientId: ${CLIENT_ID}
clientSecret: ${CLIENT_SECRET}
Token değerleri ${ENV_VAR} interpolasyonunu destekler — çalışma zamanında ortam değişkenlerinden veya sistem özelliklerinden çözümlenir.
Kullanım
@Test
@UseAuth("adminToken")
public void createUser() {
apiClient().post("/api/users")
.body(Map.of("name", "Alice"))
.send()
.assertStatus(201);
}
Tüm bir sınıfa uygulayın:
@UseAuth("serviceAccount")
public class OrderApiTest extends BaseApiTest {
@Test
public void listOrders() {
ApiClient.get("/api/orders").send().assertStatus(200);
}
@Test
public void createOrder() {
ApiClient.post("/api/orders").body(...).send().assertStatus(201);
}
}
Metod düzeyindeki @UseAuth, sınıf düzeyine göre önceliklidir.
İstek Bazında ve Global Auth
| Yaklaşım | Kapsam | En uygun |
|---|---|---|
.auth(ApiAuth.bearerToken(...)) | Tek istek | Farklı tokenlarla yapılan tek seferlik çağrılar |
ApiClient.setGlobalAuth(...) | Thread üzerindeki tüm istekler | Çalışma zamanı tokenları (giriş yanıtı) |
@UseAuth("name") | Test metodu veya sınıfı | CI'da yapılandırma/ortam değişkeni tabanlı tokenlar |