0

连接到连接到本地的订阅者子帐户目标时出错。来自提供商帐户的多租户应用程序通过连接服务和 S4 SDK api 在 Cloud Foundry 中的系统。同样的安排适用于指向另一个与 provider subaccount 连接的本地系统的目标连接。

参考 SAP 帮助,显示连接服务具有开箱即用的内置功能: https ://help.sap.com/viewer/cca91383641e40ffbe03bdc78f00f681/Cloud/en-US/9c0bdd0efc8640739c9d2fa5cfe56cbd.html

通过 S4 SDK API 从提供商子账户中运行的提供商 SAAS 应用程序访问订阅者子账户目标时出现以下错误:

完整的堆栈跟踪:

http-nio-8080-exec-6","level":"ERROR","categories":[],"msg":"Servlet.service() for servlet [dispatcherServlet] 在路径 [] 的上下文中抛出异常 [请求处理失败;嵌套异常是 com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException:com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException:无法获取订阅者服务实例的目的地:无法获取访问令牌目的地服务。如果您的应用程序在 Cloud Foundry 上运行,请确保绑定到目标服务和授权和信任管理 (xsuaa) 服务,并且您已正确保护您的应用程序或已将“ALLOW_MOCKED_AUTH_HEADER”环境变量设置为 true . 请注意,具有用户传播的身份验证类型(例如主体传播或 OAuth2 SAML Bearer 流)要求您保护您的应用程序,并且在使用“ALLOW_MOCKED_AUTH_HEADER”环境变量时不起作用。如果您的应用程序未在 Cloud Foundry 上运行,例如,在部署到本地容器时,请考虑声明“destinations”环境变量以配置目的地。] 根本原因","stacktrace":["com.sap.cloud. sdk.cloudplatform.security.exception.TokenRequestDeniedException:无法获取访问令牌:XSUAA 服务拒绝请求,HTTP 状态为 401(未授权)。请确保将您的应用程序正确绑定到 XSUAA 服务实例。请注意,如果您使用的服务计划不适合您的方案,也可能会出现此错误。如果您在 Cloud Foundry 上构建 SaaS 应用程序,请在创建 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.requestAccessToken(XsuaaService.java:156) ","tat com.sap.cloud.sdk.cloudplatform.connectivity.XsuaaService.getServiceToken(XsuaaService.

请帮忙。

谢谢,悉达多

    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 >
    }
4

2 回答 2

4

您是否按照此处所述在应用程序中实现了订阅者回调服务? https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/ff540477f5404e3da2a8ce23dcee602a.html

更重要的是getDependencies回调(过程步骤 2)。我知道它说的是可选的,但是当使用像目的地这样的服务时,它是必要的。它是必需的,以便在订阅期间,SaaS 供应服务知道配置目标服务以授权订阅者帐户。

另外,如果之前没有实现:在实现并重新部署应用程序后,需要重新完成订阅过程才能使必要的配置生效。

于 2019-04-26T14:15:29.330 回答
2

为此,您需要在 getDependecies 回调中将目标服务的 xsappname 作为依赖项返回(如下所示)

@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;
        }

如果您已经完成订阅,请记住再次订阅。

完成后,您可以使用来自目标服务的订阅者子域和凭据(客户端 ID 和密码)生成承载。

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

将 Bearer 令牌传递给目标服务 API 以读取订阅者帐户目标。

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

于 2019-09-10T11:45:43.270 回答