Не удалось получить адресаты субсчета подписчика Платформа SAP Cloud -CF

Ошибка при подключении к абоненту Назначение дополнительной учетной записи, подключенное к локальной сети. система в облачном литейном из мультитенантного приложения из учетной записи провайдера через сервис подключения и API S4 SDK. Та же схема работает нормально, когда целевое соединение указывает на другую локальную систему, связанную с субсчетом провайдера.

Ссылаясь на справку SAP, которая показывает, что служба подключения имеет эту встроенную возможность из коробки: https://help.sap.com/viewer/cca91383641e40ffbe03bdc78f00f681/Cloud/en-US/9c0bdd0efc8640739c9d2fa5cfe56cbd.html

Получение следующей ошибки при доступе к назначению субсчета подписчика из приложения SAAS провайдера, работающего в субсчете провайдера через API S4 SDK:

Полная трассировка стека:

"2019-04-09T11: 25: 03.714 + 0000 [APP / PROC / WEB / 0] OUT {" writ_at":"2019-04-09T11:25:03.708Z","writ_ts":2225588987993569,"component_type":"приложение","component_id":"212c1a7d-c897-4834-8f7c-6e2a3d6bfed3","space_name":"Песочница", "имя_компонента": "подключение","component_instance":"0","organization_id":"-" "correlation_id":"-","organization_name":"-","space_id":"f057513a-85e3-4229-B42F-f0fe7a058fa6","container_id":"10.0.75.11","тип":" журнал ", "регистратор": " org.apache.catalina.core.ContainerBase [Tomcat] [локальный] [/] [DispatcherServlet]","нить...": "HTTP-NiO-8080-Exec-6","level":"ERROR","Categories":[],"msg":"Servlet.service() для сервлета [dispatcherServlet] в контексте с исключением path [] выбросило [Ошибка обработки запроса; вложенное исключение: com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException: com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException: не удалось получить назначения для экземпляра службы подписчика: не удалось получить маркер доступа для служба назначения. Если ваше приложение работает в Cloud Foundry, убедитесь, что оно имеет привязку как к службе назначения, так и к службе авторизации и доверительного управления (xsuaa), И что вы либо правильно защитили свое приложение, либо установили для переменной среды "ALLOW_MOCKED_AUTH_HEADER" значение true, Обратите внимание, что типы аутентификации с распространением пользователя, например, основным распространением или потоком носителя SAML OAuth2, требуют защиты вашего приложения и не будут работать при использовании переменной среды "ALLOW_MOCKED_AUTH_HEADER". Если ваше приложение не работает на Cloud Foundry, например, при развертывании в локальном контейнере, рассмотрите возможность объявления переменной среды "destination" для настройки адресатов.] С первопричиной ","stacktrace":["com.sap.cloud.sdk.cloudplatform.security.exception.TokenRequestDeniedException: невозможно получить маркер доступа: службе XSUAA отказано в запросе с состоянием HTTP 401 (неавторизовано). Убедитесь, что вы правильно связали свое приложение с экземпляром службы XSUAA. Обратите внимание, что эта ошибка также может возникнуть, если вы используете план обслуживания, который не подходит для вашего сценария. Если вы создаете приложение SaaS на Cloud Foundry, выберите план приложения "application" при создании экземпляра XSUAA. Если вы создаете службу повторного использования, которая должна использоваться другими приложениями, выберите тарифный план "broker". "," Tat com.sap.cloud.sdk.cloudplatform.connectivity.TokenRequest.executeTokenRequest(TokenRequest.java:128)","tat com.sap.cloud.sdk.cloudplatform.connectivity.TokenRequest.requestTokenWithClientCredentialsGrant(TokenRequest.java:385)","tat com.sap.cloud.sdk.cloudplatform.connectivity.XsuaaService.reenest.aservice.jer ()","tat com.sap.cloud.sdk.cloudplatform.connectivity.XsuaaService.getServiceToken(XsuaaService.java:216)","tat com.sap.cloud.sdk.cloudplatform.connectivity.DestinationServiceCommand.getAccessTokerCommand: Destination 111)","tat com.sap.cloud.sdk.cloudplatform.connectivity.DestinationServiceCommand.run(DestinationServiceCommand.java:124)","tat com.sap.cloud.sdk.cloudplatform.connectivity.DestinationServiceCommand.run(DestinationServiceCom.java:28)","tat com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)","tat com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)","tat rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)","tat rx.internal.operators.OnSubscribeDeferc (.java:35)","tat rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)","tat rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)","tat rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)","tat rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)","tat rx.internal.operators.OnSubscribeLift.call(OnSubscribe.java:48)","tat rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)","tat rx.Observable.unsafeSubscribe(Observable.java:10327)","tat rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)","tat rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)","tat rx.Observable.unsafeSubscribe(Observable.java:10327) tat rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)","tat rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)","tat rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)", tat rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)","tat rx.Observable.unsafeSubscribe(Observable.java:10327)","tat rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriberjubOrs:100)","tat com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56)","tat com.netflix.hystrix.strategy.concurrency.:47)","tat com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69)","tat rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)", tat java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)","tat java.util.concurrent.FutureTask.run(FutureTask.java:266)","tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)","tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)","tat java.lang.Thread.run(Thread.java:836)"] } 2019-04-09T11:25:03.754+0000 [RTR/5] OUT connectivity-test.cfapps.eu10.hana.ondemand.com - [2019-04-09T11:25:01.668+0000] "GET /odata/UserDetails HTTP/1.1" 500 0 1257 "https://.authentication.eu10.hana.ondemand.com/login" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/73.0.3683.86 Safari/537.36" "-" "10.0.75.11:61046" x_forwarded_for:"-" x_forwarded_proto:"https" vcap_request_id:"eab6830 4b-eb681 1 -da051adfb1db" response_time:2,085981657 APP_ID:"212c1a7d-c897-4834-8f7c-6e2a3d6bfed3" app_index:"0" x_correlationid:"8e2d22b0-b4c7-4d20-5461-600aea37b2d2" x_b3_traceid:"7c4752638ec93577" x_b3_spanid:"7c4752638ec93577" x_b3_parentspanid:"-" b3:"7c4752638ec93577-7c4752638ec93577"

Пожалуйста помоги.

Спасибо, Сиддхарт

    if (TenantAccessor.getCurrentTenant().getTenantId().equals("<Subscriber tenet id>"))
            {
                final ErpConfigContext configContext = new ErpConfigContext("TEST_dest");

    else

    {
     < call provider destination using the above code with the destination belonging to Provider account >
    }

1 ответ

Вы внедрили услуги обратного вызова абонента в своем приложении, как описано здесь? https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/ff540477f5404e3da2a8ce23dcee602a.html

Более важным является getDependencies обратный вызов (процедура, шаг 2). Я знаю, что это говорит необязательно, но при использовании таких услуг, как пункт назначения, это необходимо. Это необходимо для того, чтобы во время подписки служба обеспечения SaaS знала, как настроить службу назначения для авторизации учетной записи подписчика.

Кроме того, если это не было реализовано ранее: после внедрения и повторного развертывания приложения необходимо повторно выполнить процесс подписки, чтобы настройки вступили в силу.

Для этого вам необходимо вернуть xsappname вашей целевой службы как зависимость в обратном вызове getDependecies (как показано ниже)

@GetMapping(value = "/callback/v1.0/dependencies")
        public List<DependantServiceDto> callbackGet() {
            String logMessage = "callback service successfully called with RequestMethod = GET for tenant ";
            //logger.info(logMessage);
            List<DependantServiceDto> dependenciesList = new ArrayList<>();
            JSONObject vcap;
            String destinationXsAppName = "";
            try {
                vcap = new JSONObject(System.getenv("VCAP_SERVICES"));
                JSONArray arr = vcap.getJSONArray("destination");
                JSONObject credentials = arr.getJSONObject(0).getJSONObject("credentials");
                destinationXsAppName = credentials.getString("xsappname");
                if(!destinationXsAppName.isEmpty()){
                    dependenciesList.add(new DependantServiceDto(destinationXsAppName));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return dependenciesList;
        }

Не забудьте сделать подписку еще раз, если вы уже сделали это.

Как только вы закончите, вы можете сгенерировать Bearer, взятый с использованием поддомена подписчика и учетных данных (идентификатор клиента и секрет) из целевой службы.

https://subacriber-subdomain.authentication.sap.hana.ondemand.com/oauth/token?grant_type=client_credentials&response_type=token

Передайте токен носителя в API целевой службы, чтобы прочитать адресаты учетной записи подписчика.

https://destination-configuration.cfapps.sap.hana.ondemand.com/destination-configuration/v1/destinations/destinationName

Другие вопросы по тегам