Java 如何通过OkHttp和改型为Spring应用程序提供凭据
我开发了具有webflux基本身份验证的spring非web服务。 它工作正常,我能够成功地使用cURL到达某些端点,如: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服务进行通信 这个过程更
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();
}