Подключение к локальной системе из приложения java, развернутого в Cloud Foundry - PullRequest
0 голосов
/ 06 марта 2020

Я разрабатываю Java внутреннее приложение в Spring, которое предназначено для развертывания в SAP Cloud Foun dry. Я должен подключиться к внутренней локальной системе. Я следовал этому руководству: https://help.sap.com/viewer/cca91383641e40ffbe03bdc78f00f681/Cloud/en-US/313b215066a8400db461b311e01bd99b.html, а также связанным с ним учебникам, чтобы все настроить. Я все еще не могу правильно подключиться к системе, я получаю java.lang.RuntimeException: Http Connection failed with status 403 Forbidden. Я счастлив, что система отвечает, но я не могу аутентифицировать себя. Панель администрирования Cloud Connector показывает, что система достижима. Когда я захожу на вкладку «Назначения», я вижу, что соединение с системой также было успешным. Мое приложение привязано к экземплярам служб Connectivity и XSUAA, как указано в руководстве. Вот фрагмент кода, который я использую, чтобы попытаться подключиться к системе

JSONObject jsonObj = new JSONObject(System.getenv("VCAP_SERVICES"));
JSONArray jsonArr = jsonObj.getJSONArray("connectivity");
JSONObject connectivityCredentials = jsonArr.getJSONObject(0).getJSONObject("credentials");

JSONObject jsonObjXsuaa = new JSONObject(System.getenv("VCAP_SERVICES"));
JSONArray jsonArrXsuaa = jsonObjXsuaa.getJSONArray("xsuaa");
JSONObject xsuaaCredentials = jsonArrXsuaa.getJSONObject(0).getJSONObject("credentials");

String connProxyHost = connectivityCredentials.getString("onpremise_proxy_host");
int connProxyPort = Integer.parseInt(connectivityCredentials.getString("onpremise_proxy_http_port"));
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(connProxyHost, connProxyPort));

URL url = new URL("http://pl-*************.com:8000");

HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(proxy);

String clientid = connectivityCredentials.getString("clientid");
String clientsecret = connectivityCredentials.getString("clientsecret");

URI xsuaaUrl = new URI(xsuaaCredentials.getString("url"));

UaaContextFactory factory = UaaContextFactory.factory(xsuaaUrl).authorizePath("/oauth/authorize").tokenPath("/oauth/token");
TokenRequest tokenRequest = factory.tokenRequest();
tokenRequest.setGrantType(GrantType.CLIENT_CREDENTIALS);
tokenRequest.setClientId(clientid);
tokenRequest.setClientSecret(clientsecret);
UaaContext xsuaaContext = factory.authenticate(tokenRequest);
CompositeAccessToken accessToken = xsuaaContext.getToken();

urlConnection.setRequestProperty("Proxy-Authorization", "Bearer " + accessToken);

String credentials = MessageFormat.format("{0}:{1}", "USER", "PASSWORD");
byte[] encodedBytes = Base64.encodeBase64(credentials.getBytes());
urlConnection.setRequestProperty("Authorization", "Basic " + new String(encodedBytes));

HttpStatusCodes code =  ConnectionController.checkStatus(urlConnection);
public static HttpStatusCodes checkStatus(HttpURLConnection connection) throws IOException {
        HttpStatusCodes httpStatusCode = HttpStatusCodes.fromStatusCode(connection.getResponseCode());
        if (400 <= httpStatusCode.getStatusCode() && httpStatusCode.getStatusCode() <= 599) {
            throw new RuntimeException("Http Connection failed with status " + httpStatusCode.getStatusCode() + " " + httpStatusCode.toString());
        }
        return httpStatusCode;
}

Возвращенный код - 403. - Запрещено, хотя я думаю, что правильно предоставил все необходимые учетные данные. Чего мне не хватает?

...