java - 在 io.restassured api 测试中使用 Windows 身份验证

标签 java rest-assured

我们正在尝试测试使用 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/

相关文章:

java - 如何运行具有相关任务的并发作业?

java - 如何放心地重置/删除/清除请求正文

java - 当我将对象放入正文时,我得到不同的字段名称

rest-assured - 从 Rest Assured 响应中提取嵌套值

java - 如何在放心的框架中中止一个请求?

java - 如何将jtable的内容复制到剪贴板

java - 我如何使用 JLabel?

java非阻塞HTTP客户端

java - JInternalFrame 不显示

java - 无法使用 JsonPath 库获取带空格的键值