Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过OkHttp和改型为Spring应用程序提供凭据_Java_Spring Boot_Retrofit2_Basic Authentication_Okhttp - Fatal编程技术网

Java 如何通过OkHttp和改型为Spring应用程序提供凭据

Java 如何通过OkHttp和改型为Spring应用程序提供凭据,java,spring-boot,retrofit2,basic-authentication,okhttp,Java,Spring Boot,Retrofit2,Basic Authentication,Okhttp,我开发了具有webflux基本身份验证的spring非web服务。 它工作正常,我能够成功地使用cURL到达某些端点,如: curl -I --user user:password http://localhost:5051/service/v1/health or curl -I http://user:password@localhost:5051/service/v1/health 但现在我试图通过其他服务发送帖子,这些服务使用OkHttp和改型与我的spring服务进行通信 这个过程更

我开发了具有webflux基本身份验证的spring非web服务。 它工作正常,我能够成功地使用cURL到达某些端点,如:

curl -I --user user:password http://localhost:5051/service/v1/health
or
curl -I http://user:password@localhost:5051/service/v1/health
但现在我试图通过其他服务发送帖子,这些服务使用OkHttp和改型与我的spring服务进行通信

这个过程更复杂,在主要应用程序中,创建OkHttpCllient,然后调用独立的翻新服务客户端提供者

主应用程序:

    httpUrl = url
                .newBuilder()
                .username(Username) // first approach
                .password(Password)
                {..}
                .build();
 public static Service createService(final HttpUrl baseUrl, final OkHttpClient okHttpClient) {
        return createRetrofit(baseUrl, okHttpClient).create(Service.class);
    }

    protected static Retrofit createRetrofit(HttpUrl baseUrl, OkHttpClient client) {

        return new Retrofit
                .Builder()
                .baseUrl(baseUrl)
                .client(client)
                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
    }
和改装服务客户提供商:

    httpUrl = url
                .newBuilder()
                .username(Username) // first approach
                .password(Password)
                {..}
                .build();
 public static Service createService(final HttpUrl baseUrl, final OkHttpClient okHttpClient) {
        return createRetrofit(baseUrl, okHttpClient).create(Service.class);
    }

    protected static Retrofit createRetrofit(HttpUrl baseUrl, OkHttpClient client) {

        return new Retrofit
                .Builder()
                .baseUrl(baseUrl)
                .client(client)
                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
    }
我采取了3种不同的方法来解决这个问题,你可以在他们旁边的评论中看到。 首先是通过url传递用户名和密码,看起来像:

 http://user:password@localhost:5051/service/v1/health
但即使使用此符号的curl有效,身份验证也不会通过

第二种方法是在OkHttpClient.Builder()中创建验证器。 结果仍然一样

第三个是在OkHttpClient中创建拦截器。 在这种方法中,我能够通过stubbed服务器的单元测试, 这在其他解决方案中是不可能的(状态404,未找到):

但我仍然无法通过我的主应用程序(状态401,未经授权)将记录发送到我的Spring服务


我的问题是,在Spring非web、webflux基本身份验证安全应用程序中,通过OkHttp和改装传递凭据的正确方法是什么?似乎问题在于创建OkHttpClient的单例方法。该系统使用两个不同的Spring服务运行,并记住了其中一个凭据,因此他无法正确访问第二个服务。 为了解决这个问题,我创建了第二个OkHttpClient类,并使用“拦截器”方法提供授权数据

 public static Service createService(final HttpUrl baseUrl, final OkHttpClient okHttpClient) {
        return createRetrofit(baseUrl, okHttpClient).create(Service.class);
    }

    protected static Retrofit createRetrofit(HttpUrl baseUrl, OkHttpClient client) {

        return new Retrofit
                .Builder()
                .baseUrl(baseUrl)
                .client(client)
                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
    }
 http://user:password@localhost:5051/service/v1/health
    @BeforeClass
    public static void setUpClass() {
        serviceStubServer = new StubServer();
        whenHttp(serviceStubServer)
                .match(Condition.basicAuth("user", "pass"), Condition.post("/service/v1/health"))
                .then(
                        Action.status(HttpStatus.OK_200),
                );
        serviceStubServer.run();
    }