我有一个与 Cloud Foundry 交互的 Spring Boot 项目
我有以下代码:
CloudFoundryController.java:
package com.backend
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.context.ApplicationListener;
import org.cloudfoundry.operations.CloudFoundryOperations;
import org.cloudfoundry.operations.applications.GetApplicationRequest;
import org.cloudfoundry.operations.DefaultCloudFoundryOperations;
import org.cloudfoundry.reactor.DefaultConnectionContext;
import org.cloudfoundry.reactor.TokenProvider;
import org.cloudfoundry.reactor.client.ReactorCloudFoundryClient;
import org.cloudfoundry.reactor.tokenprovider.PasswordGrantTokenProvider;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class BackendApplication implements ApplicationListener<ApplicationFailedEvent> {
private static final Logger logger = LoggerFactory.getLogger(BackendApplication.class);
public static void main(String[] args) {
// Hardcoded Cloud Foundry client configuration
String target = "thisistheurl";
String org = "thisisthename";
String space = "thisisthename";
String user = "thisisthelogin";
String password = "thisisthepass";
try {
// Configure and login to Cloud Foundry
final PasswordGrantTokenProvider tokenProvider = PasswordGrantTokenProvider.builder()
.username(user)
.password(password)
.build();
final DefaultConnectionContext connectionContext = DefaultConnectionContext.builder()
.apiHost(target)
.build();
final ReactorCloudFoundryClient client = ReactorCloudFoundryClient.builder()
.connectionContext(connectionContext)
.tokenProvider(tokenProvider)
.build();
final DefaultCloudFoundryOperations operations = DefaultCloudFoundryOperations.builder()
.cloudFoundryClient(client)
.organization(org)
.space(space)
.build();
operations.applications().list().subscribe(application ->
System.out.printf(" %s%n", application.getName())
);
} catch (Exception e) {
logger.error("Error interacting with Cloud Foundry: " + e.getMessage());
}
}
@Override
private static URL getTargetURL(String target) {
try {
return URI.create(target).toURL();
} catch (MalformedURLException e) {
throw new RuntimeException("The target URL is not valid: " + e.getMessage());
}
}
}
我有以下库:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.cloudfoundry</groupId>
<artifactId>cloudfoundry-operations</artifactId>
<version>5.12.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.cloudfoundry</groupId>
<artifactId>cloudfoundry-client-reactor</artifactId>
<version>5.12.1.RELEASE</version>
</dependency>
我得到的是: HTTP/1.1 401 未经授权
以及相应的异常:
2024-04-21T23:26:04.769+12:00 ERROR 36848 --- [backend] [ry-client-nio-2] cloudfoundry-client.compatibility : An error occurred while checking version compatibility:
org.cloudfoundry.uaa.UaaException: invalid_client: Bad credentials
at org.cloudfoundry.reactor.util.ErrorPayloadMappers.lambda$null$8(ErrorPayloadMappers.java:104) ~[cloudfoundry-client-reactor-5.12.1.RELEASE.jar:na]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.MonoCacheTime] :
reactor.core.publisher.Mono.checkpoint(Mono.java:2261)
org.cloudfoundry.reactor.tokenprovider.AbstractUaaTokenProvider.token(AbstractUaaTokenProvider.java:330)
Error has been observed at the following site(s):
*__checkpoint() ⇢ at org.cloudfoundry.reactor.tokenprovider.AbstractUaaTokenProvider.token(AbstractUaaTokenProvider.java:330)
*__checkpoint() ⇢ at org.cloudfoundry.reactor.client.v2.info.ReactorInfo.get(ReactorInfo.java:52)
当我执行以下操作时:
cf -a thisistheurl -u thisisthelogin -p thisisthepass
工作完美,登录正常。
但是据我所知,java 库执行以下操作:
newlink/v2/info
发出GET请求并获取authorization_endpoint,类似于login.thisistheurl
login.thisistheurl/oauth/token
进行 POST 并获得“未经授权”,这是完全正确的,因为我无法通过浏览器使用我的凭据登录(并且可能不应该能够)。任何人都可以帮助纠正我的实施吗?
该代码实际上运行得很完美。我必须检查处理变量的准确性。具体问题未知。