Springboot 中的 Cloud Foundry Java 客户端:通过 /oauth/token 登录失败

问题描述 投票:0回答:1

我有一个与 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 库执行以下操作:

  • 向提供的 api url 发出 GET 请求并获取 cloud_controller_v2 属性作为新链接
  • newlink/v2/info
    发出GET请求并获取authorization_endpoint,类似于
    login.thisistheurl
  • 尝试向
    login.thisistheurl/oauth/token
    进行 POST 并获得“未经授权”,这是完全正确的,因为我无法通过浏览器使用我的凭据登录(并且可能不应该能够)。

任何人都可以帮助纠正我的实施吗?

spring-boot cloud-foundry cloudfoundry-java-client java-cfenv
1个回答
0
投票

该代码实际上运行得很完美。我必须检查处理变量的准确性。具体问题未知。

© www.soinside.com 2019 - 2024. All rights reserved.