我们正在尝试测试使用 Windows 身份验证的 api。我正在使用rest-assured 包来测试api。有什么建议如何将 Windows 登录用户分配给 api 请求 header 吗?
最佳答案
修改了我的答案
因此,目前这很难做到,因为您需要为 REST Assured 配置 HTTPClient,但它仅支持已弃用的 AbstractHttpClient
。这是我的实现。但我没有能力测试它......
import io.restassured.RestAssured;
import org.apache.http.annotation.Contract;
import org.apache.http.annotation.ThreadingBehavior;
import org.apache.http.auth.AuthScheme;
import org.apache.http.auth.AuthSchemeFactory;
import org.apache.http.auth.AuthSchemeProvider;
import org.apache.http.auth.AuthSchemeRegistry;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.impl.auth.BasicSchemeFactory;
import org.apache.http.impl.auth.DigestSchemeFactory;
import org.apache.http.impl.auth.win.WindowsCredentialsProvider;
import org.apache.http.impl.auth.win.WindowsNegotiateScheme;
import org.apache.http.impl.client.AbstractHttpClient;
import org.apache.http.impl.client.SystemDefaultCredentialsProvider;
import org.apache.http.impl.client.SystemDefaultHttpClient;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HttpContext;
import org.testng.annotations.Test;
import static io.restassured.RestAssured.given;
import static io.restassured.config.HttpClientConfig.httpClientConfig;
import static java.net.HttpURLConnection.HTTP_OK;
public class WinHttpClientTest {
@Test
public void test() {
@Contract(threading = ThreadingBehavior.IMMUTABLE)
class WindowsNTLMSchemeFactory implements AuthSchemeProvider, AuthSchemeFactory {
private final String servicePrincipalName;
public WindowsNTLMSchemeFactory(final String servicePrincipalName) {
super();
this.servicePrincipalName = servicePrincipalName;
}
@Override
public AuthScheme create(final HttpContext context) {
return new WindowsNegotiateScheme(AuthSchemes.NTLM, servicePrincipalName);
}
@Override
public AuthScheme newInstance(HttpParams params) {
return new WindowsNegotiateScheme(AuthSchemes.NTLM, null) ;
}
}
@Contract(threading = ThreadingBehavior.IMMUTABLE)
class WindowsNegotiateSchemeFactory implements AuthSchemeProvider, AuthSchemeFactory {
private final String servicePrincipalName;
public WindowsNegotiateSchemeFactory(final String servicePrincipalName) {
super();
this.servicePrincipalName = servicePrincipalName;
}
@Override
public AuthScheme create(final HttpContext context) {
return new WindowsNegotiateScheme(AuthSchemes.SPNEGO, servicePrincipalName);
}
@Override
public AuthScheme newInstance(HttpParams params) {
return new WindowsNegotiateScheme(AuthSchemes.SPNEGO, null);
}
}
AuthSchemeRegistry authSceme = new AuthSchemeRegistry();
authSceme.register(AuthSchemes.BASIC, new BasicSchemeFactory());
authSceme.register(AuthSchemes.DIGEST, new DigestSchemeFactory());
authSceme.register(AuthSchemes.NTLM, new WindowsNTLMSchemeFactory(null));
authSceme.register(AuthSchemes.SPNEGO, new WindowsNegotiateSchemeFactory(null));
final CredentialsProvider credsProvider = new WindowsCredentialsProvider(new SystemDefaultCredentialsProvider());
AbstractHttpClient httpClient = new SystemDefaultHttpClient();
httpClient.setAuthSchemes(authSceme);
httpClient.setCredentialsProvider(credsProvider);
RestAssured.config = RestAssured.config().httpClient(httpClientConfig().httpClientFactory(() -> httpClient));
given()
.log().all()
.when()
.get("http://httpbin.org/get")
.then()
.log().all()
.statusCode(HTTP_OK);
}
}
关于java - 在 io.restassured api 测试中使用 Windows 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43789323/