https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/SAP-Connectivity-service-blog-posts.xmlSAP Community - SAP Connectivity service2026-02-26T00:12:31.418268+00:00python-feedgenSAP Connectivity service blog posts in SAP Communityhttps://community.sap.com/t5/technology-blog-posts-by-sap/tell-us-about-your-experience-with-sap-btp-connectivity/ba-p/13577270Tell us about Your Experience with SAP BTP Connectivity2023-10-18T23:22:32+02:00frank_muellerhttps://community.sap.com/t5/user/viewprofilepage/user-id/223421Have you ever been in touch with the Connectivity service or the Destination service for SAP Business Technology Platform (SAP BTP)?<BR />
<BR />
For example, creating or configuring a destination in the BTP cockpit, or doing some connectivity configuration in your app code?<BR />
<BR />
If so, let us know about your experience.<BR />
<BR />
There's a really short survey (5 minutes or less) that will help us improve SAP BTP Connectivity components according to your feedback.<BR />
<BR />
You can find the survey <A href="https://sapinsights.eu.qualtrics.com/jfe/form/SV_7VZeDjYI5FSHJCS?source=blog" target="_blank" rel="nofollow noopener noreferrer">here</A>.<BR />
<BR />
<BR />
<BR />
Thank you!2023-10-18T23:22:32+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/it-has-never-been-easier-connecting-cloud-apps-to-internet-and-on-premises/ba-p/13578208It has never been easier! Connecting cloud apps to Internet and on-premises systems using SAP BTP Connectivity2023-11-14T21:29:59+01:00ManolVhttps://community.sap.com/t5/user/viewprofilepage/user-id/181738<P>It is a common scenario that cloud applications need to connect to remote systems to fulfil the business goals of their creators and those of their end users. This is essential for enterprise applications, which are generally complex and consume data from and/or push data to a variety of sources or destinations – systems that are directly accessible, systems hosted in <A href="https://en.wikipedia.org/wiki/Cloud_computing" target="_blank" rel="noopener nofollow noreferrer">public or private cloud</A>, or such that are hosted in the <A href="https://en.wikipedia.org/wiki/On-premises_software" target="_blank" rel="noopener nofollow noreferrer">customer premises</A>. This use case is called hybrid connectivity.<BR /><BR />Sounds complex, right?! With this blog post, I show you that it has never been easier to solve this problem. Let’s get started and see how <A href="https://help.sap.com/docs/connectivity" target="_blank" rel="noopener noreferrer">SAP BTP Connectivity</A> can help with this challenge, more specifically, in <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/d1abd18556f24fb091d081b2e3454b8b.html" target="_blank" rel="noopener noreferrer">SAP BTP Kyma environment</A>.</P><H2 id="toc-hId-964073126">Prerequisites</H2><P><BR />Well, complex things cannot be made simple without proper preparation work. Therefore, I need to setup the environment. For the purposes of this blog post, I don’t get into details on how each step is done, if interested, you can follow the links:</P><OL><LI>Setup the <STRONG>cloud</STRONG> environment:</LI><OL><LI>Create a <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/144e1733d0d64d58a7176e817fa6aeb3.html" target="_blank" rel="noopener noreferrer">SAP BTP subaccount</A> - the <A href="https://en.wikipedia.org/wiki/Platform_as_a_service" target="_blank" rel="noopener nofollow noreferrer">PaaS</A> context in the domain of <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/6a2c1ab5a31b4ed9a2ce17a5329e1dd8.html" target="_blank" rel="noopener noreferrer">SAP BTP</A>, i.e., an account enabled to instantiate cloud application development environments, create and manage service instances, etc.</LI><LI>Enable <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/d1abd18556f24fb091d081b2e3454b8b.html" target="_blank" rel="noopener noreferrer">Kyma environment</A> - the cloud-native application hosting environment<OL><LI>Enable <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/0c035010a9d64cc8a02d872829c7fa75.html" target="_blank" rel="noopener noreferrer">Connectivity Proxy</A> for cloud to premise technical connectivity, an <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/7501fbc9aebd4e3180eddec977ca288d.html" target="_blank" rel="noopener noreferrer">integrated module in Kyma environment</A><BR />Edit: In the meantime, <A href="https://help.sap.com/whats-new/cf0cb2cb149647329b5d02aa96303f56?Component=Connectivity&Valid_as_Of=2024-03-12%3A2024-03-12&locale=en-US" target="_blank" rel="noopener noreferrer">since March 12, 2024,</A> <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/7501fbc9aebd4e3180eddec977ca288d.html" target="_blank" rel="noopener noreferrer">Connectivity Proxy has become a native Kyma Module</A></LI><LI>Enable <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/1700cfe070704d2e80aa76de1033a6c4.html" target="_blank" rel="noopener noreferrer">Transparent Proxy</A> for unified, virtually transparent technical connectivity to any destination or data source, an <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/1b548e9ad4744b978b8b595288b0cb5c.html" target="_blank" rel="noopener noreferrer">integrated module in Kyma environment</A></LI></OL></LI></OL><LI>Setup the <STRONG>local</STRONG> environment<OL><LI>Install <A href="https://kubernetes.io/docs/reference/kubectl/" target="_blank" rel="noopener nofollow noreferrer">Kubectl</A> - the command line interface for <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/3e25944e491049b2aeec68c562a5ee48.html" target="_blank" rel="noopener noreferrer">connecting to and interacting with the Kyma instance</A></LI><LI>Install <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/e6c7616abb5710148cfcf3e75d96d596.html" target="_blank" rel="noopener noreferrer">Cloud Connector</A> for <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/f42fe4471d6a4a5fb09b7f3bb83c66a4.html" target="_blank" rel="noopener noreferrer">controlled and secure exposure concrete systems or resources</A>, hosted in a <A href="https://en.wikipedia.org/wiki/Virtual_private_cloud" target="_blank" rel="noopener nofollow noreferrer">VPC</A> on <A href="https://en.wikipedia.org/wiki/Hyperscale_computing" target="_blank" rel="noopener nofollow noreferrer">Hyperscalers</A> or <A href="https://en.wikipedia.org/wiki/On-premises_software" target="_blank" rel="noopener nofollow noreferrer">on-premises</A> - in my case, on my PC.</LI></OL></LI><LI>For each scenario use case, <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/84e45e071c7646c88027fffc6a7bb787.html" target="_blank" rel="noopener noreferrer">create the relevant destinations in SAP Destination service</A> using <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/4e750660b72e4fd6b2485ffb0b3cbdca.html" target="_blank" rel="noopener noreferrer">SAP BTP cockpit</A>.</LI></OL><P> </P><H2 id="toc-hId-767559621">Overview of the scenario</H2><P><BR />Image: <EM>Scenario Schematic Overview</EM></P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/uc-tp-kyma-blog-scenario-schematic-overview.png" border="0" /></P><P><BR />This solution diagram depicts the high-level architecture and layout of the SAP BTP tools, software components, services listed above in the <STRONG>Prerequisites</STRONG> section. The focus on the scenario is on the <STRONG>Application</STRONG> side. The rest is depicted for completeness and better end-to-end understanding.<BR /><BR />In this blog, I showcase how I can connect my cloud application to the following <STRONG>target systems</STRONG>. I start with the <STRONG>trivial</STRONG> and then continue with the more <STRONG>advanced</STRONG> use cases:</P><OL><LI><STRONG><EM>Google</EM></STRONG> - direct connectivity <SPAN>without</SPAN> using any of the SAP BTP Connectivity software and services</LI><LI><STRONG><EM>Google via destination</EM></STRONG> - direct connectivity <SPAN>with</SPAN> usage of SAP BTP Connectivity software and services</LI><LI><STRONG><EM>Google via destination and Cloud Connector</EM></STRONG> - indirect cloud to premise connectivity - in my setup Google is directly accessible via my local Cloud Connector<BR /><U><EM>Note</EM></U>: this use case is presented <U>only for the purpose of showcase</U> and ease the perception of the reader, <STRONG>it is not expected to be done in production</STRONG></LI><LI><STRONG><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/access-sap-authorization-and-trust-management-service-apis" target="_blank" rel="noopener noreferrer">SAP Authorization and Trust Management Service (XSUAA)</A> via destination</STRONG> - OAuth based REST API</LI><LI><STRONG><EM>An HTTP system hosted on-premises</EM></STRONG> <EM><STRONG>via destination and Cloud Connector </STRONG></EM>- indirect cloud to premise connectivity</LI><LI><STRONG><EM>An HTTPS system hosted on-premises</EM> <EM>via destination and Cloud Connector </EM></STRONG>- indirect cloud to premise connectivity with <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/c84d4d0b12d34890b334998185f49e88.html" target="_blank" rel="noopener noreferrer">Principal Propagation</A> enabled, i.e., end-to-end secure user context propagation, a.k.a <A href="https://en.wikipedia.org/wiki/Single_sign-on" target="_blank" rel="noopener nofollow noreferrer">Single Sign On (SSO)</A>.</LI></OL><P>I pick those systems to showcase what I claimed in the begging of this blog - <STRONG>It has never been easier!</STRONG><BR /><BR /><U>Note</U>: For the creation of the destination pointing to XSUAA in step 4 of the scenario, I followed these two simple steps in <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/4e750660b72e4fd6b2485ffb0b3cbdca.html" target="_blank" rel="noopener noreferrer">BTP cockpit</A>:</P><OL><LI><A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/8221b7434d8e484fab5ec5d219b7bf64.html" target="_blank" rel="noopener noreferrer">Create a service instance</A> of <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/ebc9113a520e495ea5fb759b9a7929f2.html" target="_blank" rel="noopener noreferrer">service "xsuaa", plan "apiaccess"</A></LI><LI><A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/685f383cebb54c009b2fac633b32c90f.html" target="_blank" rel="noopener noreferrer">Create a destination pointing to the service instance via destinations UI</A> - just a few clicks job!</LI></OL><H2 id="toc-hId-571046116">Configure the scenario</H2><P><BR />To get the scenario in action, at first I need to configure the target systems as technical connection configurations, a.k.a. destinations. In this way I control to which systems the application has access to and can switch the used technical authentication and authorisation mechanisms on the fly – changing the destination attributes without affecting the experience of the end user, and without affecting the lifecycle of the application.</P><H3 id="toc-hId-503615330">Expose the on-premises system to the cloud</H3><P><BR />For the destinations pointing to systems hosted in the customer premises (points 5 and 6 of the scenario overview), I need to securely expose those to the cloud.<BR /><BR />You guessed it, for this I configure the respective <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/f42fe4471d6a4a5fb09b7f3bb83c66a4.html" target="_blank" rel="noopener noreferrer">Access Controls</A> in my <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/e6c7616abb5710148cfcf3e75d96d596.html" target="_blank" rel="noopener noreferrer">SAP Cloud Connector</A>:<BR /><BR />Image: <EM>Access Control entries in Cloud Connector</EM></P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/scc-access-controls-1.png" border="0" /></P><P><BR />In this example, the two systems hosted in the on-premises are simple HTTP and HTTPS servers:<BR /><BR /></P><UL><UL><LI>System #1:<STRONG><EM> localhost:8000</EM></STRONG> - serves <EM>HTTP</EM>, returns status code: <STRONG><EM>200 </EM></STRONG>with the received HTTP request line as a message.</LI></UL></UL><P><BR /><BR /><BR /></P><UL><UL><LI>System #2:<STRONG><EM> localhost:9000</EM></STRONG> - serves <EM>HTTP<STRONG>S</STRONG></EM>, returns status code: <EM><STRONG>200</STRONG></EM> with the received HTTP request line as a message, and the subject common name (CN) of the received <SPAN>X.509 client certificate as part of the HTTP request - the user context propagated from the cloud, achieving Single Sign-On (SSO).</SPAN></LI></UL></UL><P><BR /><BR /></P><H3 id="toc-hId-307101825">Manage the technical connection configurations</H3><P><BR />One of the best practices for cloud-native applications is to externalise any configuration and avoid coupling it with the lifecycle of the application, e.g. via hard-coding it. I use <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/7e306250e08340f89d6c103e28840f30.html" target="_blank" rel="noopener noreferrer">Destination service</A> for <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/84e45e071c7646c88027fffc6a7bb787.html" target="_blank" rel="noopener noreferrer">managing the technical connection configurations (a.k.a. destinations)</A>, as guided by the Golden Path defined in <A href="https://cap.cloud.sap/docs/about/" target="_blank" rel="noopener nofollow noreferrer">Cloud Application Programming</A> model of <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/6a2c1ab5a31b4ed9a2ce17a5329e1dd8.html" target="_blank" rel="noopener noreferrer">SAP BTP</A>.<BR /><BR />In the context of my <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/144e1733d0d64d58a7176e817fa6aeb3.html" target="_blank" rel="noopener noreferrer">SAP BTP subaccount</A>, I create the following destinations, pointing to the variety of systems I’ll connect my cloud app workload running in my Kyma instance.<BR /><BR />Image: <EM>Destinations in BTP cockpit</EM></P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/BTP-cockpit-destinations.png" border="0" /></P><P><BR /><BR /></P><H3 id="toc-hId-110588320">Expose the destinations in the Kyma instance</H3><P><BR />To allow an application to consume the defined destinations, I declaratively expose only those I'm interested in, and are specific for this particular use case. For this, I <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/c5257cf110bf4b7b9054eab74ededff4.html" target="_blank" rel="noopener noreferrer">create specific Destination Custom Resources</A>, a <A href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/" target="_blank" rel="noopener nofollow noreferrer">common practice for cloud-native applications based on Kubernetes</A>. In Kyma environment, I can do this either via <A href="https://kyma-project.io/#/01-overview/ui/README?id=kyma-dashboard" target="_blank" rel="noopener nofollow noreferrer">Kyma Dashboard</A>, or via command-line using <A href="https://kubernetes.io/docs/reference/kubectl/" target="_blank" rel="noopener nofollow noreferrer">Kubectl</A>.<BR /><BR />Image: <EM>Creation of a Destination CR in Kyma Dashboard</EM></P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/DestinationCRs-create-CR.png" border="0" /></P><P><BR />Shortly after the <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/c5257cf110bf4b7b9054eab74ededff4.html" target="_blank" rel="noopener noreferrer">Destination CR</A> is created, <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/acc64ada71e34f98867f16fbcc471b5e.html" target="_blank" rel="noopener noreferrer">Transparent Proxy</A> process it and updates the status of the Destination CR with a message that the technical connectivity is successfully configured, and this destination is ready to be consumed.<BR /><BR />Image: <EM>Status of a Destination CR in Kyma Dashboard</EM></P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/DestinationCR-ConfigurationSuccessful.png" border="0" /></P><P><BR />Using the same approach, I expose all the destinations required specifically for this use case.<BR /><BR />Image: <EM>Destination CRs in Kyma </EM><I>Dashboard</I></P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/DestinationCRs.png" border="0" /></P><P><BR />It's all set now, let's play with the application.</P><H2 id="toc-hId--215007904">Scenario in action: Connect the application to the remote systems</H2><P><BR />As described in the status message of the <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/c5257cf110bf4b7b9054eab74ededff4.html" target="_blank" rel="noopener noreferrer">Destination CR</A>, the <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/acc64ada71e34f98867f16fbcc471b5e.html" target="_blank" rel="noopener noreferrer">Transparent Proxy</A> exposed the referenced <STRONG>destination</STRONG> via the specified name in the form of <STRONG>locally accessible host</STRONG>, leveraging the concept of <A href="https://kubernetes.io/docs/concepts/services-networking/service/" target="_blank" rel="noopener nofollow noreferrer">Kubernetes Service</A>.<BR /><BR />As a result, it’s <EM>trivial</EM> for the application to connect to those local hosts, and this is the only task needed to be performed. It’s that easy!<BR /><BR />For simplicity and versatility reasons, my application is represented by a local terminal attached to a container running in a <A href="https://kubernetes.io/docs/concepts/workloads/pods/" target="_blank" rel="noopener nofollow noreferrer">Kubernetes Pod</A> in the Kyma Instance. Then I use <A href="https://en.wikipedia.org/wiki/CURL" target="_blank" rel="noopener nofollow noreferrer">cURL</A> command-line tool for executing HTTP requests towards the target systems.<BR /><BR />How it’s done? Once connected to the Kyma instance via Kubectl, I run a sample <A href="https://hub.docker.com/r/curlimages/curl" target="_blank" rel="noopener nofollow noreferrer">cURL image</A> as a <A href="https://kubernetes.io/docs/concepts/workloads/pods/" target="_blank" rel="noopener nofollow noreferrer">Kuberenetes Pod</A> and open a terminal session via the following command:</P><P> </P><pre class="lia-code-sample language-abap"><code>kubectl run mycurlpod -n sap-transp-proxy-system --image=curlimages/curl -i --tty -- sh</code></pre><P> </P><P><BR /> </P><H3 id="toc-hId--282438690">Executing request to Google:</H3><P><BR />This is a trivial direct invocation of the public web page of Google:</P><P> </P><pre class="lia-code-sample language-abap"><code>~ $ curl www.google.com -v
* Trying 142.250.179.164:80...
* Connected to www.google.com (142.250.179.164) port 80
> GET / HTTP/1.1
> Host: www.google.com
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 200 OK
...
<
<!doctype html><html...<title>Google</title><script...</code></pre><P> </P><P> </P><H3 id="toc-hId--478952195">Executing request to Google via destination:</H3><P><BR />This is an example reaching the same public web page of Google, but this time via <EM>destination</EM>, locally exposed and served by Transparent Proxy, and centrally managed via Destination service:</P><P> </P><pre class="lia-code-sample language-abap"><code>~ $ curl google -v
* Trying 10.111.255.220:80...
* Connected to google (10.111.255.220) port 80
> GET / HTTP/1.1
> Host: google
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 200 OK
...
<
<!doctype html><html...<title>Google</title><script...</code></pre><P> </P><P> </P><H3 id="toc-hId--675465700">Executing request to Google via destination via Cloud Connector:</H3><P><BR />This is an example of reaching the same public web page of Google via <EM>destination</EM>, locally exposed and served by Transparent Proxy, Connectivity Proxy, and centrally managed via Destination service. The destination is configured to point to an on-premises system, exposed to the cloud via Cloud Connector:</P><P> </P><pre class="lia-code-sample language-abap"><code>~ $ curl mypremisegoogle -v
* Trying 10.111.159.5:80...
* Connected to mypremisegoogle (10.111.159.5) port 80
> GET / HTTP/1.1
> Host: mypremisegoogle
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 200 OK
...
<
<!doctype html><html...<title>Google</title><script...</code></pre><P> </P><P> </P><H3 id="toc-hId--947210574">Executing request to XSUAA API via destination:</H3><P><BR />This is an example for <A href="https://api.sap.com/api/AuthorizationAPI/resource/Applications" target="_blank" rel="noopener noreferrer">getting the registered service instances of the current subaccount</A> via <EM>destination</EM>, locally exposed and served by Transparent Proxy, and centrally managed via Destination service.</P><P> </P><pre class="lia-code-sample language-abap"><code>~ $ curl xsuaa-api/sap/rest/authorization/v2/apps -v
* Trying 10.106.192.162:80...
* Connected to xsuaa-api (10.106.192.162) port 80
> GET /sap/rest/authorization/v2/apps HTTP/1.1
> Host: xsuaa-api
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 200 OK
< cache-control: no-cache, no-store, max-age=0, must-revalidate
< content-length: 10621
...
<
[{"appid":"app123!b13","serviceinstanceid":"15442f82-7d82-11ee-b26d-ab53f17d39a5","planId":"HWEgt9/213f90b0+/7d82-11ee=","planName":"broker"...</code></pre><P> </P><P> </P><H3 id="toc-hId--1143724079">Executing request to an on-premises HTTP server via destination via Cloud Connector:</H3><P><BR />This is an example of connecting to a simple on-premises HTTP server via <EM>destination</EM>, locally exposed and served by Transparent Proxy, Connectivity Proxy, and centrally managed via Destination service. The destination is configured to point to an on-premises system, exposed to the cloud via Cloud Connector:</P><P> </P><pre class="lia-code-sample language-abap"><code>~ $ curl mypremserver/test-path -v
* Trying 10.110.23.19:80...
* Connected to mypremserver (10.110.23.19) port 80
> GET /test-path HTTP/1.1
> Host: mypremserver
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 200 OK
...
<
Response generated by HTTP server:
GET /test-path HTTP/1.1</code></pre><P> </P><P> </P><H3 id="toc-hId--1340237584">Executing request to an on-premises HTTPS server via destination via Cloud Connector with Single Sign-On enabled:</H3><P><BR />This is an example of connecting to an on-premises HTTPS server via <EM>destination</EM>, locally exposed and served by Transparent Proxy, Connectivity Proxy, and centrally managed via Destination service. The HTTPS server requires the cloud user identity to be propagated. The destination is configured with PrincipalPropagation as authentication type, and to point to an on-premises system, exposed to the cloud via Cloud Connector:</P><P> </P><pre class="lia-code-sample language-abap"><code>~ $ curl myppserver -H 'Authorization: Bearer eyJhbGciOiJSUzI1Ni...bwKMpAGKbhECqvkyibC7Q' -v
* Trying 10.105.101.106:80...
* Connected to myppserver (10.105.101.106) port 80
> GET / HTTP/1.1
> Host: myppserver
> User-Agent: curl/8.4.0
> Accept: */*
> Authorization: Bearer yJhbGciOiJSUzI1Ni...bwKMpAGKbhECqvkyibC7Q
>
< HTTP/1.1 200 OK
< server: envoy
< date: Tue, 07 Nov 2023 15:17:47 GMT
< content-type: text/plain; charset=utf-8
< content-length: 1956
< x-envoy-upstream-service-time: 657
<
>>>>>>>>>
Response generated by HTTPS server:
GET / HTTP/1.1
=========
Received X.509 client certificate with Subject: <Name(CN=manol.valchev@sap.com)></code></pre><P> </P><P> </P><H2 id="toc-hId--1243348082">Summary</H2><P><BR />As you can see, <STRONG>it’s that simple!</STRONG> No matter of the type and hosting location of the target system, from the application development perspective the user experience is the same – <STRONG><EM>simple, unified, virtually transparent</EM></STRONG>, and the technical complexity is handled by the usage of software components and services part of <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/e54cc8fbbb571014beb5caaf6aa31280.html" target="_blank" rel="noopener noreferrer"><STRONG>SAP BTP Connectivity</STRONG></A> product portfolio:</P><UL><UL><LI><A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/7e306250e08340f89d6c103e28840f30.html" target="_blank" rel="noopener noreferrer"><STRONG>Destination service</STRONG></A> for <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/84e45e071c7646c88027fffc6a7bb787.html" target="_blank" rel="noopener noreferrer">managing the technical connection configurations (a.k.a. destinations)</A></LI></UL></UL><UL><UL><LI><A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/1700cfe070704d2e80aa76de1033a6c4.html" target="_blank" rel="noopener noreferrer"><STRONG>Transparent Proxy</STRONG></A> for unified, virtually transparent technical connectivity to any destination or data source, an <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/1b548e9ad4744b978b8b595288b0cb5c.html" target="_blank" rel="noopener noreferrer">integrated module in Kyma environment</A>, also <A href="https://hub.docker.com/u/sapse" target="_blank" rel="noopener nofollow noreferrer">available in Docker Hub</A>.</LI></UL></UL><UL><UL><LI><A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/0c035010a9d64cc8a02d872829c7fa75.html" target="_blank" rel="noopener noreferrer"><STRONG>Connectivity Proxy</STRONG></A> for cloud to premise technical connectivity, an <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/0c035010a9d64cc8a02d872829c7fa75.html" target="_blank" rel="noopener noreferrer">integrated component in Kyma environment</A>, also <A href="https://hub.docker.com/u/sapse" target="_blank" rel="noopener nofollow noreferrer">available in Docker Hub</A>.</LI></UL></UL><UL><UL><LI><A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/e6c7616abb5710148cfcf3e75d96d596.html" target="_blank" rel="noopener noreferrer"><STRONG>Cloud Connector</STRONG></A> for <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/f42fe4471d6a4a5fb09b7f3bb83c66a4.html" target="_blank" rel="noopener noreferrer">controlled and secure exposure concrete systems or resources</A>, hosted in a <A href="https://en.wikipedia.org/wiki/Virtual_private_cloud" target="_blank" rel="noopener nofollow noreferrer">VPC</A> on <A href="https://en.wikipedia.org/wiki/Hyperscale_computing" target="_blank" rel="noopener nofollow noreferrer">Hyperscalers</A> or <A href="https://en.wikipedia.org/wiki/On-premises_software" target="_blank" rel="noopener nofollow noreferrer">on-premises</A>.</LI></UL></UL><UL><UL><LI><STRONG><A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/e54cc8fbbb571014beb5caaf6aa31280.html" target="_blank" rel="noopener noreferrer">Connectivity service</A></STRONG> as the backbone for the multitude of <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/0c035010a9d64cc8a02d872829c7fa75.html" target="_blank" rel="noopener noreferrer">Connectivity Proxy</A> and <A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/e6c7616abb5710148cfcf3e75d96d596.html" target="_blank" rel="noopener noreferrer">Cloud Connector</A> instances serving thousands of <A href="https://help.sap.com/docs/BTP/65de2977205c403bbc107264b8eccf4b/6a2c1ab5a31b4ed9a2ce17a5329e1dd8.html" target="_blank" rel="noopener noreferrer">SAP BTP</A> customers</LI></UL></UL><P><BR />Тhis simple yet powerful approach enables <STRONG>application developers</STRONG> to <STRONG>focus more on their business goals</STRONG> and <STRONG>delegate the technical complexity</STRONG> to <STRONG><A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/e54cc8fbbb571014beb5caaf6aa31280.html" target="_blank" rel="noopener noreferrer">SAP BTP Connectivity</A></STRONG>, and at the same time the application administrators can manage the outbound technical connections (via destinations) without affecting the lifecycle and availability of the application itself.<BR /><BR />Stay tuned and subscribe to <A href="https://help.sap.com/whats-new/cf0cb2cb149647329b5d02aa96303f56?Component=Connectivity" target="_blank" rel="noopener noreferrer">What's New for SAP BTP Connectivity</A> page.</P>2023-11-14T21:29:59+01:00https://community.sap.com/t5/technology-blog-posts-by-members/hey-abap-cloud-please-let-me-save-my-data-export-to-azure-storage-please/ba-p/13572978Hey ABAP Cloud please let me save my data export to Azure Storage please🥺🙏- part 42023-11-21T13:21:26+01:00Martin-Pankrazhttps://community.sap.com/t5/user/viewprofilepage/user-id/143781<TABLE style="border-collapse: collapse;width: 100%" border="1"><BR />
<TBODY><BR />
<TR style="height: 14px"><BR />
<TD style="width: 100%;background-color: #ffd57a;height: 14px"><BR />
<BR />
<STRONG><span class="lia-unicode-emoji" title=":backhand_index_pointing_right:">👉🏿</span></STRONG><STRONG>back to </STRONG><A href="https://blogs.sap.com/2023/06/06/kick-start-your-sap-abap-platform-integration-journey-with-microsoft/" target="_blank" rel="noopener noreferrer"><STRONG>blog series</STRONG></A> or jump to <A href="https://github.com/MartinPankraz/steampunk-helper" target="_blank" rel="nofollow noopener noreferrer">GitHub repos</A>🧑🏽<span class="lia-unicode-emoji" title=":laptop_computer:">💻</span><BR />
<BR />
<<<A href="https://blogs.sap.com/2023/07/20/sap-btp-abap-environment-integration-journey-with-microsoft-part-3/" target="_blank" rel="noopener noreferrer">part 3</A></TD><BR />
</TR><BR />
</TBODY><BR />
</TABLE><BR />
Hello and welcome back to your ABAP Cloud with Microsoft integration journey. Part 3 of this series got you covered with modern GraphQL API definition on top of your ABAP Cloud RAP APIs to expose a single API endpoint that may consume many different OData, OpenAPI, or REST endpoints at the same time.<BR />
<BR />
<STRONG>Today will be different</STRONG>. Sparked by a <A href="https://twitter.com/PanzerDominik/status/1683252126884003840" target="_blank" rel="nofollow noopener noreferrer">SAP community conversation</A> with <SPAN class="mention-scrubbed">dpanzer</SPAN> and <SPAN class="mention-scrubbed">lars.hvam</SPAN> including a <A href="https://answers.sap.com/questions/14009359/createsend-a-file-to-ftp-server-via-abap-cloud-or.html" target="_blank" rel="noopener noreferrer">community question</A> by <SPAN class="mention-scrubbed">rammel</SPAN> on working with files with ABAP Cloud, I got inspired to propose a solution for the question below:<BR />
<P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-twitter.png" height="146" width="493" /></P><BR />
Before we dive into my proposal see here a list of alternative options that I came across as food for thought for your own research.<BR />
<TABLE><BR />
<TBODY><BR />
<TR><BR />
<TD width="301"><A href="https://docs.cloudfoundry.org/devguide/services/using-vol-services.html" target="_blank" rel="nofollow noopener noreferrer">Mount a file system</A> to a Cloud Foundry app</TD><BR />
<TD width="301">Create custom API hosted by your CF app and call via http client from ABAP Cloud</TD><BR />
</TR><BR />
<TR><BR />
<TD width="301"><A href="https://blogs.sap.com/2021/05/12/how-to-connect-from-sap-cloud-integration-to-on-premise-sftp-server/" target="_blank" rel="noopener noreferrer">Connect to SFTP server</A> via SAP Cloud Integration</TD><BR />
<TD width="301">Design iFlow and call via http client from ABAP Cloud</TD><BR />
</TR><BR />
<TR><BR />
<TD width="301">Integrate with <A href="https://help.sap.com/docs/document-management-service/sap-document-management-service/what-is-document-management-service" target="_blank" rel="noopener noreferrer">SAP Document Management Service</A></TD><BR />
<TD width="301">Call <A href="https://api.sap.com/package/SAPDocumentManagementServiceIntegrationOptionCMISAPI/rest" target="_blank" rel="noopener noreferrer">SAP BTP REST APIs</A> from ABAP Cloud directly</TD><BR />
</TR><BR />
<TR><BR />
<TD width="301">Integrate with <A href="https://help.sap.com/docs/object-store/object-store-service-on-sap-btp/what-is-object-store" target="_blank" rel="noopener noreferrer">SAP BTP Object Store</A> exposing hyperscaler storage services using SDKs</TD><BR />
<TD width="301">Create custom API hosted by your CF or Kyma app and call via http client from ABAP Cloud</TD><BR />
</TR><BR />
<TR><BR />
<TD width="301">Serve directly from ABAP Code via XCO</TD><BR />
<TD width="301">Base64-encode your file content, wrap into ABAP code, and serve as XCO class. Lars likes it at least <span class="lia-unicode-emoji" title=":winking_face_with_tongue:">😜</span>. There were sarcastic smiles involved and some more “oh please”, so take it not too seriously.</TD><BR />
</TR><BR />
<TR><BR />
<TD width="301">Raise an <A href="https://influence.sap.com/sap/ino/#/campaigns" target="_blank" rel="noopener noreferrer">influencing request at SAP</A> to release something like the former NetWeaver MIME repos</TD><BR />
<TD width="301">Live the dream</TD><BR />
</TR><BR />
</TBODY><BR />
</TABLE><BR />
A <STRONG>common theme</STRONG> among all the options is the <STRONG>need to interact</STRONG> with them from <STRONG>ABAP Cloud via the built-in http client</STRONG>. On the downside some options require an additional app on CF or Kyma to orchestrate the storage interactions.<BR />
<BR />
<STRONG>Ideally ABAP Cloud integrates directly with the storage account</STRONG> to reduce complexity and maintenance.<BR />
<H1 id="toc-hId-834818605">You guessed rightly my own proposal focusses on direct integration with Azure Blob</H1><BR />
To get started with this sample I ran through the SAP developer tutorial “<A href="https://developers.sap.com/tutorials/abap-environment-console-application.html" target="_blank" rel="noopener noreferrer">Create Your First ABAP Cloud Console Application</A>” and steps 1-6 of “<A href="https://developers.sap.com/tutorials/abap-environment-external-api.html" target="_blank" rel="noopener noreferrer">Call an External API and Parse the Response in SAP BTP ABAP Environment</A>. This way you can easily reproduce from an official reference.<BR />
<BR />
Got your hello world on Eclipse? Great, onwards, and upwards in the stack we go then 🪜. Or down to the engine room – that depends on your perspective.<BR />
<BR />
All the blob storage providers offer various options to authenticate with the service. See the current coverage for Azure <A href="https://learn.microsoft.com/en-us/azure/storage/common/authorize-data-access#understand-authorization-for-data-operations" target="_blank" rel="nofollow noopener noreferrer">here</A>.<BR />
<P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-auth-methods.png" /></P><BR />
<P style="text-align: center">Fig.1 Screenshot of supported authentication methods for Azure Storage</P><BR />
The Microsoft Entra ID option offers superior security capabilities compared to access keys – which can be leaked or lost for example – and is therefore recommended by Microsoft.<BR />
<BR />
For developer ease, I left the code using the simpler to configure “<A href="https://learn.microsoft.com/azure/ai-services/translator/document-translation/how-to-guides/create-sas-tokens?tabs=Containers" target="_blank" rel="nofollow noopener noreferrer">Shared-Access-Signature (SAS) tokens</A>” commented on the <A href="https://github.com/MartinPankraz/steampunk-helper/blob/main/steampunk-part4/z_cl_steampunk_to_azure_blob.abap" target="_blank" rel="nofollow noopener noreferrer">shared GitHub repos</A>. SAS tokens can be created from the Azure portal with two clicks.<BR />
<BR />
The <A href="https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key" target="_blank" rel="nofollow noopener noreferrer">shared key approach</A> requires a bit of hashing and marshaling on ABAP. Use the <A href="https://github.com/microsoft/ABAP-SDK-for-Azure" target="_blank" rel="nofollow noopener noreferrer">ABAP SDK for Azure</A> to accelerate that part of your implementation. Check the “<A href="https://github.com/microsoft/ABAP-SDK-for-Azure/blob/master/src/zadf/zadf_service_blob/zcl_adf_service_blob.clas.abap#L656" target="_blank" rel="nofollow noopener noreferrer">get_sas_token</A>” method for reference.<BR />
<BR />
<A href="https://learn.microsoft.com/azure/storage/blobs/anonymous-read-access-configure?tabs=portal" target="_blank" rel="nofollow noopener noreferrer">Anonymous read access</A> would only be ok for less sensitive content like static image files or the likes because anyone can access them once they have the URL.<BR />
<H1 id="toc-hId-638305100">For an enterprise-grade solution however, you will need to use a more secure protocol like OAuth2 with Microsoft Entra ID</H1><BR />
Technically you could do the OAuth2 token fetching with plain http-client requests from ABAP Cloud. See <A href="https://jacekw.dev/blog/2022/oauth-client-credentials-from-abap-cloud/" target="_blank" rel="nofollow noopener noreferrer">this blog</A> by <SPAN class="mention-scrubbed">jacek.wozniczak</SPAN> for instance. However, it is recommended to use the steampunk “Communication Management” to abstract away the configuration from your code. Think “external configuration store”. Also, it reduces the complexity of your ABAP code, because Communication Management handles the OAuth2 flow for you.<BR />
<TABLE style="border-collapse: collapse;width: 100%" border="1"><BR />
<TBODY><BR />
<TR><BR />
<TD style="width: 100%;background-color: #ffc68a"><span class="lia-unicode-emoji" title=":loudspeaker:">📢</span>Note: SAP will release the needed capability to maintain OAuth2 scopes in communication arrangements as part of your ABAP Cloud requests with the upcoming <A href="https://help.sap.com/docs/abap-cross-product/roadmap-info/integration-services?locale=en-US#security-for-integration-services" target="_blank" rel="noopener noreferrer">SAP BTP, ABAP environment 2402</A>.</TD><BR />
</TR><BR />
</TBODY><BR />
</TABLE><BR />
So, till then you will need to use the BTP Destination service. Target <STRONG>destinations</STRONG> <STRONG>living on subaccount level</STRONG> by calling them like so (omitting the i_service_instance_name, thank you <SPAN class="mention-scrubbed">thwiegan</SPAN> for calling that out <A href="https://answers.sap.com/questions/13305436/abap-environment-cannot-access-remote-odata-servic.html" target="_blank" rel="noopener noreferrer">here</A><span class="lia-unicode-emoji" title=":disappointed_face:">😞</span><BR />
<PRE class="language-abap"><CODE>destination = cl_http_destination_provider=>create_by_cloud_destination(<BR />
i_name = |azure-blob|<BR />
i_authn_mode = if_a4c_cp_service=>service_specific<BR />
).</CODE></PRE><BR />
Or call <STRONG>destinations living on Cloud Foundry</STRONG> spaces like so:<BR />
<PRE class="language-abap"><CODE>destination = cl_http_destination_provider=>create_by_cloud_destination(<BR />
i_name = |azure-blob|<BR />
i_service_instance_name = |SAP_BTP_DESTINATION|<BR />
i_authn_mode = if_a4c_cp_service=>service_specific<BR />
).</CODE></PRE><BR />
For above Cloud Foundry variation you need to deploy the “standard” communication scenario <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/integration-and-connectivity-communication-management#destination" target="_blank" rel="noopener noreferrer">SAP_COM_0276</A>. My generated arrangement id in this case was “SAP_BTP_DESTINATION”.<BR />
<BR />
Be aware, SAP marked the approach with BTP destinations as <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/http-communication-via-destination-service-deprecated" target="_blank" rel="noopener noreferrer">deprecated</A> for BTP ABAP. And we can now see why. It will be much nicer doing it from the single initial communication arrangement only, rather than having the overhead with additional services and arrangements. Looking forward to that in February <span class="lia-unicode-emoji" title=":smiling_face_with_sunglasses:">😎</span><BR />
<BR />
Not everything is “bad” about using BTP destinations with ABAP Cloud though. They have management APIs, which the communication arrangements don’t have yet. Also, re-use of APIs across your BTP estate beyond the boundary of your ABAP Environment tenant would be useful.<BR />
<H3 id="toc-hId-699957033">A fully automated solution deployment with the BTP and Azure terraform providers is only possible with the destination service approach as of today.</H3><BR />
See <A href="https://github.com/SAP-samples/teched2023-XP160" target="_blank" rel="nofollow noopener noreferrer">this TechEd 2023 session</A> and watch this new <A href="https://github.com/SAP-samples/btp-terraform-samples/tree/use-cases-ms/in-development/uc_abap_env_ms_obj_store" target="_blank" rel="nofollow noopener noreferrer">sample repos</A> (still in development) for reference.<BR />
<H1 id="toc-hId-245278090">The application flow is quite simple once the authentication part is figured out</H1><BR />
Access your communication management config from your ABAP web Ui:<BR />
<P style="padding-left: 40px"><A href="https://your-steampunk-domain.abap-web.eu20.hana.ondemand.com/ui#Shell-home" target="test_blank" rel="nofollow noopener noreferrer">https://your-steampunk-domain.abap-web.eu20.hana.ondemand.com/ui#Shell-home</A></P><BR />
Steampunk supports the <A href="https://help.sap.com/docs/sap-btp-abap-environment/abap-environment/supported-protocols-and-authentication-methods" target="_blank" rel="noopener noreferrer">typical set of authentication flows</A> for outbound communication users using http that you are used to from BTP. I chose the OAuth2 Client Credentials grant because that is most widely referenced in the BTP world and reasonably secure.<BR />
<P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-overview.png" /></P><BR />
<P style="text-align: center">Fig.2 ABAP Cloud API flow including OAuth2 token request from Microsoft Entra ID</P><BR />
Since I am integrating with an Azure Storage account, I will need to authenticate via Microsoft Entra ID (formerly known as Azure Active Directory).<BR />
<BR />
Yes, Microsoft likes renaming stuff from time to time, too <span class="lia-unicode-emoji" title=":winking_face:">😉</span>.<BR />
<BR />
Using the <A href="https://learn.microsoft.com/rest/api/storageservices/operations-on-blobs" target="_blank" rel="nofollow noopener noreferrer">Azure Storage REST API</A> I can create, update, delete, and list files as I please.<BR />
<H1 id="toc-hId-48764585">The Entra ID setup takes a couple of clicks</H1><BR />
Create a new App registration from Microsoft Entra ID service on your Azure portal and generate a new secret. Beware of the expiry date!<BR />
<BR />
Below preferred option will start working once SAP adds the scope parameter for OAuth2 Client Credentials grant as described before.<BR />
<P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-auth-setup1.png" /></P><BR />
<P style="text-align: center">Fig.3 Screenshot of attribute and secret mapping for ABAP Cloud Outbound user</P><BR />
For now, let’s have a look at a destination on subaccount level instead. Be aware the scope parameter needs to be “<A href="https://storage.azure.com/.default" target="_blank" rel="nofollow noopener noreferrer">https://storage.azure.com/.default</A>” (see fig.4 below, additional properties section called “scope” on the bottom right). That is also the setting that we are missing for the preferred approach mentioned above.<BR />
<BR />
The standard login URLs for OAuth token endpoints on Microsoft Entra ID are the following:<BR />
<P style="padding-left: 40px"><A href="https://login.microsoftonline.com/your-tenantId/oauth2/v2.0/token" target="test_blank" rel="nofollow noopener noreferrer">https://login.microsoftonline.com/your-tenantId/oauth2/v2.0/token</A></P><BR />
<P style="padding-left: 40px"><A href="https://login.microsoftonline.com/your-tenantId/oauth2/v2.0/authorize" target="test_blank" rel="nofollow noopener noreferrer">https://login.microsoftonline.com/your-tenantId/oauth2/v2.0/authorize</A></P><BR />
<P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-auth-setup2.png" /></P><BR />
<P style="text-align: center">Fig.4 Screenshot of attribute mapping from Entra ID to SAP BTP Destination</P><BR />
So far so good. Let’s roll the integration test from our ABAP console application on Eclipse (ADT).<BR />
<P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-result.png" /></P><BR />
<P style="text-align: center">Fig.5 Screenshot of file interaction from ABAP Cloud and data container view on Azure</P><BR />
Excellent, there is our booking request: Safe and sound stored as Azure Blob, posted from ABAP, and read again seamlessly.<BR />
<BR />
See the <A href="https://raw.githubusercontent.com/MartinPankraz/steampunk-helper/main/Steampunk-Helper-Lib.postman_collection.json" target="_blank" rel="nofollow noopener noreferrer">shared Postman collection</A> to help with your integration testing.<BR />
<H1 id="toc-hId--147748920">Thoughts on production readiness</H1><BR />
The biggest caveat is the regularly required OAuth2 client credential secret rotation. Unfortunately, credential-free options with Azure Managed Identities are not possible, because BTP is hyperscaler-agnostic and does not expose the underlying Azure components to you.<BR />
<BR />
Some of you might say next: let’s use client certificates with “veeery long validity time frames like 2038” to push out the problem beyond so far out someone else will have to deal with it. Well, certificate lifetimes get reduced more and more (TLS certs for instance have a maximum of 13 months at <A href="https://www.digicert.com/faq/public-trust-and-certificates/how-long-are-tls-ssl-certificate-validity-periods" target="_blank" rel="nofollow noopener noreferrer">DigiCert since 2020</A>) and you have to rotate them eventually, too <span class="lia-unicode-emoji" title=":winking_face:">😉</span>. With shorter certificate lifetimes more secure hashing algorithms come into effect much quicker for instance.<BR />
<BR />
I will dedicate a separate post on client certificates (mTLS) with steampunk to consume Azure services.<BR />
<BR />
What about <A href="https://learn.microsoft.com/graph/api/resources/federatedidentitycredentials-overview" target="_blank" rel="nofollow noopener noreferrer">federated identities</A>? You could configure trust between your SAP Cloud Identity Service (or Steampunk auth service) and Microsoft Entra ID to allow requests from ABAP Cloud to authorize Azure services. However, that would be a more complex configuration with implications for your overall setup causing larger integration test needs. And we embarked on this journey to discover a simple solution not too far away from AL11 and the likes, right? <span class="lia-unicode-emoji" title=":grinning_face_with_sweat:">😅</span><BR />
<BR />
<EM>See a working implementation of federated identities with SAP Cloud Identity service consuming Microsoft Graph published by my colleagure <SPAN class="mention-scrubbed">mraepple</SPAN> in his blog series <A href="https://blogs.sap.com/2022/11/02/principal-propagation-in-a-multi-cloud-solution-between-microsoft-azure-and-sap-business-technology-platform-btp-part-vi-calling-the-microsoft-graph-on-behalf-of-the-sap-authenticated-user/" target="_blank" rel="noopener noreferrer">here</A>.</EM><BR />
<BR />
Ok, then let’s compromise and see how we can automatically rotate secrets. Azure Key Vault exposes events for secrets, keys, and certificates to inform downstream services about due expiry. With that a small low code app can be provided to perform the secret update. See <A href="https://github.com/Azure/AzureAD-AppSecretManager" target="_blank" rel="nofollow noopener noreferrer">below sample</A> that went the extra mile asking the admins via Microsoft Teams if they wanted to perform the change or not:<BR />
<P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/11/steampunk-blob-sec-rotate.png" /></P><BR />
<P style="text-align: center">Fig.6 Architecture of secret rotation with Azure Key Vault and secret refresh approval</P><BR />
A new secret for the app registration on Entra can be generated with the <A href="https://learn.microsoft.com/en-us/graph/api/application-addpassword?view=graph-rest-1.0&tabs=http" target="_blank" rel="nofollow noopener noreferrer">Microsoft Graph API like so</A>. See <A href="https://techcommunity.microsoft.com/t5/azure-integration-services-blog/automate-secret-rotation-in-key-vault/ba-p/3275149" target="_blank" rel="nofollow noopener noreferrer">this post</A> for details on the Azure Key Vault aspects of the mix.<BR />
<BR />
To apply that flow and propagate the new secret to steampunk, we need to call BTP APIs to save the new secret. See the BTP REST API for Destinations <A href="https://api.sap.com/api/SAP_CP_CF_Connectivity_Destination/path/put_subaccountDestinations" target="_blank" rel="noopener noreferrer">here</A> to learn about the secret update method.<BR />
<BR />
Have a look at my earlier <A href="https://blogs.sap.com/2022/12/02/automatic-sap-btp-trust-store-certificate-renewal-with-azure-key-vault-or-how-to-stop-thinking-about-expiry-dates-once-and-for-all/" target="_blank" rel="noopener noreferrer">blog post</A> for specifics on how to do the same with certificates.<BR />
<BR />
<A href="https://github.com/Azure/AzureAD-AppSecretManager#costs" target="_blank" rel="nofollow noopener noreferrer">Estimated cost</A> for such a secret rotation solution for 1000 rotations per month is around 2$ per month. With simpler configurations and less rotations, it can be covered by free tiers even.<BR />
<BR />
Once you have applied the means of automation as discussed above you may incorporate this into your DevOps process and live happily ever after with no manual secret handling <span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span>.<BR />
<H1 id="toc-hId--344262425">Final Words</H1><BR />
That’s a wrap <span class="lia-unicode-emoji" title=":burrito:">🌯</span>you saw today how – in the absence of an application server file system and NetWeaver MIME repository (good old days) – you can <STRONG>use Azure Storage Account as your external data store from BTP ABAP Environment</STRONG> (steampunk) using ABAP Cloud. In addition to that, you<STRONG> gained insights into the proper setup for authentication</STRONG> and what flavors are supported by steampunk now. You got a glimpse into <STRONG>automated deployment of the solution with the BTP and Azure terraform provider</STRONG>.<BR />
<BR />
To top it up you learnt what else is needed to <STRONG>operationalize the approach</STRONG> at scale <STRONG>with regular secret/certificate rotation</STRONG>.<BR />
<BR />
Check <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/developing-external-service-consumption-outbound-communication" target="_blank" rel="noopener noreferrer">SAP’s docs for external APIs</A> with steampunk for further official materials.<BR />
<BR />
What do you think <SPAN class="mention-scrubbed">dpanzer</SPAN> and <SPAN class="mention-scrubbed">lars.hvam</SPAN>? Not too bad, is it? <span class="lia-unicode-emoji" title=":winking_face:">😉</span><BR />
<BR />
Find all the resources to replicate this setup on <A href="https://github.com/MartinPankraz/steampunk-helper" target="_blank" rel="nofollow noopener noreferrer">this GitHub repos</A>. Stay tuned for the remaining parts of the steampunk series with Microsoft Integration Scenarios from my <A href="https://blogs.sap.com/2023/06/06/kick-start-your-sap-abap-platform-integration-journey-with-microsoft/" target="_blank" rel="noopener noreferrer">overview post</A>.<BR />
<BR />
Cheers<BR />
<BR />
Martin2023-11-21T13:21:26+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/child-s-play-install-sap-btp-transparent-proxy-using-helm/ba-p/13574118Child's play: Install SAP BTP transparent proxy using Helm2024-01-15T16:14:28+01:00iliyanvidenov9https://community.sap.com/t5/user/viewprofilepage/user-id/343616<P>It is inevitable that cloud solutions have to communicate with other remote solutions. The latter can be situated on public or private clouds, or set up on client sites. Of course, it would be easier to have levers to facilitate this in the simplest possible way. This is where the <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/connectivity" target="_blank" rel="noopener noreferrer">SAP BTP Connectivity</A> services and components come to the rescue! In this blog post, you will understand how to install one of these components using <A href="https://helm.sh/" target="_blank" rel="noopener nofollow noreferrer">Helm</A>: the <STRONG><A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/acc64ada71e34f98867f16fbcc471b5e.html" target="_blank" rel="noopener noreferrer">SAP BTP transparent proxy</A></STRONG>.<BR /><BR /><SPAN class="">SAP BTP transparent proxy simplifies the connection between <A href="https://kubernetes.io/" target="_blank" rel="noopener nofollow noreferrer">Kubernetes</A> workloads and target systems defined as destinations in the <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/managing-destinations?version=Cloud" target="_blank" rel="noopener noreferrer">SAP Destination service</A>. To understand more about some of the features of the Transparent Proxy, you could check this <A href="https://blogs.sap.com/2022/11/29/transparent-consumption-of-connectivity/" target="_blank" rel="noopener noreferrer">blog</A>.</SPAN></P><H2 id="toc-hId-963953032">Prerequisites</H2><P>Before you start, you should have the following:</P><UL><LI>A <A href="https://kubernetes.io/" target="_blank" rel="noopener nofollow noreferrer">Kubernetes</A> cluster</LI><LI><A href="https://kubernetes.io/docs/reference/kubectl/" target="_blank" rel="noopener nofollow noreferrer">Kubectl</A><SPAN> installed and configured on your local machine</SPAN></LI><LI><A href="https://helm.sh/" target="_blank" rel="noopener nofollow noreferrer">Helm</A><SPAN> installed on your local machine</SPAN></LI><LI><A href="https://help.sap.com/docs/btp/sap-business-technology-platform/btp-getting-started" target="_blank" rel="noopener noreferrer">SAP BTP subaccount</A><SPAN> with a Destination service instance and a Connectivity Proxy instance (optional for on-premise connectivity)</SPAN></LI><LI><A href="https://istio.io/latest/" target="_blank" rel="noopener nofollow noreferrer">Istio</A><SPAN> or </SPAN><A href="https://cert-manager.io/" target="_blank" rel="noopener nofollow noreferrer">cert-manager</A><SPAN> running in your Kubernetes cluster as a foundation for traffic encryption between the micro-components of the </SPAN><A href="https://help.sap.com/docs/CP_CONNECTIVITY/cca91383641e40ffbe03bdc78f00f681/acc64ada71e34f98867f16fbcc471b5e.html" target="_blank" rel="noopener noreferrer">Transparent Proxy</A></LI><LI><A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/connectivity-proxy-for-kubernetes?version=Cloud" target="_blank" rel="noopener noreferrer">Connectivity proxy</A><SPAN> installed in your cluster (optional for on-premise connectivity)</SPAN></LI></UL><H2 id="toc-hId-767439527">Installation steps</H2><P>To install the Transparent Proxy using Helm, follow these steps:</P><P> 1. Create a namespace for the Transparent Proxy in your Kubernetes cluster. For example:</P><P> </P><pre class="lia-code-sample language-markup"><code>kubectl create namespace transparent-proxy</code></pre><P> </P><P> 2. Create a Kubernetes secret with the credentials of your Destination service instance</P><UL><UL><LI>You can obtain the credentials from the SAP BTP cockpit. Navigate to Services -> Instances and Subscriptions -> Click on the service instance row -> Service Keys -> View -> Copy JSON</LI></UL></UL><UL><UL><LI>Use the service key data to create the Kubernetes secret. For example:</LI></UL></UL><P> </P><pre class="lia-code-sample language-markup"><code>kubectl create secret generic dest-svc-key -n transparent-proxy --from-literal=secret='<credentials>'</code></pre><P> </P><P> 3. Create values.yaml according to your needs. You can find all available parameters <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/transparent-proxy-configuration-guide?version=Cloud" target="_blank" rel="noopener noreferrer">here</A>. For example:</P><P> </P><pre class="lia-code-sample language-markup"><code>config:
security:
communication:
internal:
encryptionEnabled: true
integration:
destinationService:
defaultInstanceName: <instance-name>
instances:
- name: <instance-name>
serviceCredentials:
secretKey: <secret-key>
secretName: <secret-name>
serviceMesh:
istio:
istio-injection: enabled</code></pre><P> </P><P> 4. Install the Transparent Proxy using the Helm values from step 3:</P><P> </P><pre class="lia-code-sample language-markup"><code>helm install transparent-proxy oci://registry-1.docker.io/sapse/transparent-proxy --version <version of helm chart> --namespace transparent-proxy -f <path-to-values.yaml></code></pre><P> </P><P>You should receive a similar to this response:</P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/Screenshot-2024-01-11-at-12.45.04.png" border="0" /></P><P class="lia-align-center" style="text-align: center;">Successful installation of Transparent Proxy with Helm</P><P> 5. Verify that the Transparent Proxy is running by checking the status of the pods and the health check:</P><P> </P><pre class="lia-code-sample language-markup"><code>kubectl get pods -n transparent-proxy</code></pre><P> </P><P>There should be two pods running:<IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/Screenshot-2024-01-11-at-12.05.51.png" border="0" /></P><P class="lia-align-center" style="text-align: center;">Transparent Proxy components after installation</P><P>As you can see, the Transparent Proxy has a health check pod which constantly checks the status of all Transparent Proxy components. You can look at what capabilities the health check has in the <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/transparent-proxy-verification-and-testing" target="_blank" rel="noopener noreferrer">Verification and Testing</A> page in the Help portal. Here's how you can execute a component check:</P><P> </P><pre class="lia-code-sample language-markup"><code>kubectl run perform-hc --image=curlimages/curl -it --rm --restart=Never -- curl -w "\n" 'sap-transp-proxy-int-healthcheck.transparent-proxy/status'</code></pre><P> </P><P>And the result should be the following:<BR /><BR /><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/Screenshot-2024-01-11-at-12.32.07.png" border="0" /><BR />This means that the sap-transp-proxy-manager, the heart of the Transparent Proxy, is running smoothly and you are ready to consume your first target system through the Transparent Proxy!</P><P> </P><H2 id="toc-hId-570926022">Try it out</H2><P>To use the Transparent Proxy, you should create a Destination Custom Resource (CR). Let's create a dynamic one. "<EM>Dynamic</EM>" means a Destination CR will serve all destinations for a Destination service instance or its tenants. Follow these steps:</P><P> 1. Create a Destination CR file with name <EM>dynamic-destination.yaml</EM>:</P><P> </P><pre class="lia-code-sample language-markup"><code>apiVersion: destination.connectivity.api.sap/v1
kind: Destination
metadata:
name: dynamic-destination
namespace: transparent-proxy
spec:
destinationRef:
name: "*"
destinationServiceInstanceName: dest-service-instance</code></pre><P> </P><P> 2. Create the resource from step 1 in your cluster:</P><P> </P><pre class="lia-code-sample language-markup"><code>kubectl create -f dynamic-destination.yaml</code></pre><P> </P><P> 3. Wait for a successful status of the Destination CR. To check it execute:</P><P> </P><pre class="lia-code-sample language-markup"><code>kubectl get dst dynamic-destination -n transparent-proxy -o yaml</code></pre><P> </P><P>You should observe a status similar to this one:</P><P> </P><pre class="lia-code-sample language-markup"><code>status:
conditions:
- lastUpdateTime: "2024-01-11T11:56:33.605473101Z"
message: Technical connectivity is configured. Kubernetes service with name
dynamic-destination is created.
reason: ConfigurationSuccessful
status: "True"
type: Available</code></pre><P> </P><P> 4. Create a curl pod, from where you can test the consumption of the target system through the Transparent Proxy:</P><P> </P><pre class="lia-code-sample language-markup"><code>kubectl run curlpod -n transparent-proxy --image=curlimages/curl -n transparent-proxy -i --tty -- sh</code></pre><P> </P><P> 5. Consume a target system defined as a destination in your Destination service instance:</P><P> </P><pre class="lia-code-sample language-markup"><code>curl dynamic-destination -H "X-Destination-Name: <destination-name>"</code></pre><P> </P><H3 id="toc-hId-503495236"> </H3><H3 id="toc-hId-306981731">Examples</H3><P>In the context of my <A href="https://help.sap.com/docs/btp/sap-business-technology-platform/btp-getting-started" target="_blank" rel="noopener noreferrer">SAP BTP subaccount</A>, I have created two destinations: one pointing to the SAP XSUAA API, and another pointing to a server on my local machine, exposed to the cloud via the <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/cloud-connector" target="_blank" rel="noopener noreferrer">SAP Cloud Connector</A>.</P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/Screenshot-2024-01-11-at-17.21.39.png" border="0" /></P><P class="lia-align-center" style="text-align: center;">Configured destinations in the SAP BTP Cockpit</P><UL><LI>Executing a request to the SAP XSUAA API. This is an example for <A href="https://api.sap.com/api/AuthorizationAPI/resource/Applications" target="_blank" rel="noopener noreferrer">getting the registered service instances of the current subaccount</A><SPAN> via </SPAN><EM>destination</EM><SPAN><SPAN>, locally exposed and served by Transparent Proxy, and centrally managed via the SAP Destination service:<BR /></SPAN></SPAN></LI></UL><P> </P><pre class="lia-code-sample language-markup"><code>~ $ curl dynamic-destination/sap/rest/authorization/v2/apps -H "X-Destination-Name: xsuaa-api" -v
* Host dynamic-destination:80 was resolved.
...
> GET /sap/rest/authorization/v2/apps HTTP/1.1
> Host: dynamic-destination
> User-Agent: curl/8.5.0
> Accept: */*
> X-Destination-Name: xsuaa-api
>
< HTTP/1.1 200 OK
...
[{"appid":"auditlog!b3718","serviceinstanceid":"0889a7e7-61d8-41...</code></pre><P> </P><P> </P><UL><LI>Executing a request to an on-premise system using principal propagation. That system is a simple server that maps the user certificate to a concrete user. The current response greets the requestor.</LI></UL><P> </P><pre class="lia-code-sample language-markup"><code>~ $ curl dynamic-destination/principal-propagation -H "X-Destination-Name: my-on-premise-system" -H "Authorization: Bearer $TOKEN" -v
* Host dynamic-destination:80 was resolved.
...
* Connected to dynamic-destination (10.104.69.106) port 80
> GET /principal-propagation HTTP/1.1
> Host: dynamic-destination
> User-Agent: curl/8.5.0
> Accept: */*
> X-Destination-Name: my-on-premise-system
> Authorization: Bearer eyJhbGciOiJSUzI1NiIsImprdS...
...
< HTTP/1.1 200 OK
...
Hello Iliyan Videnov!</code></pre><P> </P><P><BR /><SPAN class="">In this blog post, you have learned how to install SAP BTP transparent proxy using Helm, and how to easily set up it for system consumption. I hope you find it useful and enjoy it. Ideas, suggestions, and comments are welcome. Thank you for reading!</SPAN></P>2024-01-15T16:14:28+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/new-release-available-sap-cloud-connector-2-17-0/ba-p/13697681New Release Available: SAP Cloud Connector 2.17.02024-05-10T14:33:54.505000+02:00MarcoErtelhttps://community.sap.com/t5/user/viewprofilepage/user-id/6305<P>We are happy to announce that the fresh version of the SAP Cloud Connector is now available for <SPAN><A href="https://tools.hana.ondemand.com/#cloud" target="_blank" rel="noopener nofollow noreferrer">download</A></SPAN>. It is (as usual) packed with a host of new features and improvements. From bug fixes to enhancements, we've worked diligently to deliver an updated connector that addresses critical issues while also enhancing usability and functionality, which you can find more detailed in the <SPAN><A href="https://help.sap.com/whats-new/cf0cb2cb149647329b5d02aa96303f56?Component=Connectivity&locale=en-US&version=Cloud&Software_Lifecycle=General%20Availability&Valid_as_Of=2024-05-01%3A2024-05-03" target="_blank" rel="noopener noreferrer">release notes</A></SPAN>.<SPAN><BR /></SPAN>Moving onto enhancements, we've made changes to the underlying architecture and features of the Cloud Connector. One of the major changes is the switch from JavaWeb 3.x runtime on Tomcat 8.5 to JavaWeb 4.x, which operates on Tomcat 9. This new runtime container facilitates better performance and stability.<SPAN><BR /></SPAN>In addition, Cloud Connector 2.17 now supports the use of SapMachine 21 as Java runtime. This change can provide increased efficiency and flexibility for your operations.<SPAN><BR /></SPAN>One of the significant enhancements in this release is the addition of support for up to 3 LDAP servers for authentication.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarcoErtel_0-1715343899539.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108662i99117DCC49CE8FA5/image-size/medium?v=v2&px=400" role="button" title="MarcoErtel_0-1715343899539.png" alt="MarcoErtel_0-1715343899539.png" /></span></P><P>This feature is essential for setups where the user base is spread across multiple LDAP user stores or multiple user bases in a single LDAP user store (find more in the <SPAN><A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/use-ldap-for-authentication?version=Cloud" target="_blank" rel="noopener noreferrer">documentation</A></SPAN>).<BR />We've also introduced the option to configure a separate port for the HA-related communication between the master and shadow instances.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarcoErtel_1-1715343899540.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108661i432E39BA1A67206C/image-size/medium?v=v2&px=400" role="button" title="MarcoErtel_1-1715343899540.png" alt="MarcoErtel_1-1715343899540.png" /></span></P><P>This new feature enables you to use HA in conjunction with certificate-based authentication to overcome the limitation from 2.16 (find more <SPAN><A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/install-failover-instance-for-high-availability?version=Cloud" target="_blank" rel="noopener noreferrer">here</A></SPAN>)<SPAN><BR /></SPAN>Additional hardware monitoring REST APIs have been provided for disk and CPU status, allowing for more comprehensive system insights. Plus, you can now use the hardware monitor on the shadow instance as well.<SPAN><BR /></SPAN>To improve your operations, we’ve introduced for the access control settings a creation timestamp, providing more detailed and useful information for your operations:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarcoErtel_2-1715343899541.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108660i2C75337A93E41BD6/image-size/medium?v=v2&px=400" role="button" title="MarcoErtel_2-1715343899541.png" alt="MarcoErtel_2-1715343899541.png" /></span></P><P>Finally, we've improved the Cloud Connector UI by adding a session expiration progress bar. This new addition helps you keep track of your active session and alerts you when you need to log in again.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarcoErtel_3-1715343899542.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/108663i3AADF3B061835890/image-size/medium?v=v2&px=400" role="button" title="MarcoErtel_3-1715343899542.png" alt="MarcoErtel_3-1715343899542.png" /></span></P><P>In summary, with this release, we've not only ensured the highest security levels but also worked on improving the overall user experience and functionality. Don't hesitate to upgrade your Cloud Connector to version 2.17.0 today (by downloading it from <SPAN><A href="https://tools.hana.ondemand.com/#cloud" target="_blank" rel="noopener nofollow noreferrer">here</A></SPAN>) and explore these new features and improvements. For more detailed information, make sure to check out the <SPAN><A href="https://help.sap.com/whats-new/cf0cb2cb149647329b5d02aa96303f56?Component=Connectivity&locale=en-US&version=Cloud&Software_Lifecycle=General%20Availability&Valid_as_Of=2024-05-01%3A2024-05-03" target="_blank" rel="noopener noreferrer">official release notes</A></SPAN>. Enjoy the enhanced performance and functionality of the new SAP Cloud Connector!Happy Connecting!</P>2024-05-10T14:33:54.505000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/configuration-as-code-cac-with-destinations/ba-p/13699003Configuration as code (CaC) with destinations.2024-05-13T12:54:57.123000+02:00quovadishttps://community.sap.com/t5/user/viewprofilepage/user-id/743<H1 id="toc-hId-865494464">Configuration as code (CaC) with destinations.</H1><P>Destinations are very handy and powerful mechanism to facilitate access to target systems and devices.</P><P>When it comes to SAP BTP destinations, the idea is to manage both <STRONG>subaccount</STRONG> and <STRONG>instance</STRONG> level destinations (and/or their certificates) as<SPAN> </SPAN><STRONG>shared</STRONG><SPAN> </SPAN>configuration resources on a provider subaccount level.</P><P>That way, the destinations configurations can be stored as versioned assets in a source repository and need to be maintained only once per provider, thus, without incurring application runtime tie-in.</P><P>Last but not least, BTP destination service is used as a self-configuration tool.</P><H2 id="toc-hId-798063678"><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#configuration-as-code-cac-quovadis-master" target="_blank" rel="noopener nofollow noreferrer">Configuration as code with SAP BTP destination service</A></H2><P> </P><TABLE border="1"><TBODY><TR><TD>Table of Contents<OL><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#cac-dest" target="_blank" rel="noopener nofollow noreferrer">Configuration as code with SAP BTP destination service.</A></LI><OL><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#create-dest-service" target="_blank" rel="noopener nofollow noreferrer">create shared destination service instance and binding</A>.</LI></OL><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#create-bootstrap" target="_blank" rel="noopener nofollow noreferrer">Provision bootstrap destinations.</A></LI><OL><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#get-dest-credentials" target="_blank" rel="noopener nofollow noreferrer">retrieve destination service credentials from binding</A>.</LI><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#create-bootstrap-payload" target="_blank" rel="noopener nofollow noreferrer">describe bootstrap destination definitions.</A></LI><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#apply-payload" target="_blank" rel="noopener nofollow noreferrer">create bootstrap destinations on subaccount</A>.</LI></OL><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#configure-dest" target="_blank" rel="noopener nofollow noreferrer">Configure destination resources.</A></LI><OL><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#dynamic_dest" target="_blank" rel="noopener nofollow noreferrer">dynamic_dest route with managed approuter</A>.</LI><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#cloud-sdk" target="_blank" rel="noopener nofollow noreferrer">SAP Cloud SDK built-in destinations</A>.</LI></OL><LI><A href="https://gist.github.com/ptesny/aa8bc30ce043e1e11c145fe15278db62#documentation" target="_blank" rel="noopener nofollow noreferrer">Documentation.</A></LI></OL></TD></TR></TBODY></TABLE><P>PS.</P><P><STRONG>Bootstrap destinations definitions. </STRONG></P><P>Even, if there is no intrinsic BTP CLI command to assist in creation of destinations from service bindings, this can be achieved quite easily with a bit of jq gimmick by applying service binding credentials to a json payload template, for instance:</P><P> </P><pre class="lia-code-sample language-json"><code>{
"init_data": {
"subaccount": {
"destinations": [
{
"Description": "dest-httpbin",
"Type": "HTTP",
"clientId": "sb-clone12847c4c89544b4f9234b26ede429f62!b282590|destination-xsappname!b62",
"HTML5.DynamicDestination": "true",
"HTML5.Timeout": "60000",
"Authentication": "OAuth2ClientCredentials",
"Name": "dest-httpbin",
"tokenServiceURL": "https://<subdomain>.authentication.us10.hana.ondemand.com/oauth/token",
"ProxyType": "Internet",
"URL": "https://httpbin.org",
"tokenServiceURLType": "Dedicated",
"clientSecret": "<clientSecret>"
},
{
"Description": "SAP Destination Service APIs",
"Type": "HTTP",
"clientId": "sb-clone12847c4c89544b4f9234b26ede429f62!b282590|destination-xsappname!b62",
"HTML5.DynamicDestination": "true",
"HTML5.Timeout": "60000",
"Authentication": "OAuth2ClientCredentials",
"Name": "destination-service",
"tokenServiceURL": "https://<subdomain>.authentication.us10.hana.ondemand.com/oauth/token",
"ProxyType": "Internet",
"URL": "https://destination-configuration.cfapps.us10.hana.ondemand.com/destination-configuration/v1",
"tokenServiceURLType": "Dedicated",
"clientSecret": "<clientSecret>"
}
],
"certificates": [
],
"existing_certificates_policy": "update",
"existing_destinations_policy": "update"
}
}
}</code></pre><P> </P><P>Alternatively, one could resort to using SAP Cloud SDK built-in <A href="https://sap.github.io/cloud-sdk/docs/js/features/connectivity/destinations#service-binding-environment-variables" target="_self" rel="nofollow noopener noreferrer">service binding destinations</A>.</P><P>The below nodejs code snippet demonstrates how to leverage SAP Cloud SDK with its service binding destinations with the likes of service manager and destinations services.</P><pre class="lia-code-sample language-yaml"><code>apiVersion: serverless.kyma-project.io/v1alpha2
kind: Function
metadata:
name: {{ .Values.services.srv.name }}
labels:
{{- include "app.labels" . | nindent 4 }}
app: {{ .Values.services.srv.name }}
spec:
runtime: {{ .Values.services.srv.runtime }}
# runtimeImageOverride: {{ .Values.services.srv.runtimeImageOverride }}
source:
inline:
dependencies: |
{
"name": "{{ .Values.services.srv.name }}",
"version": "0.0.1",
"dependencies": {
"axios":"latest"
,"debug": "latest"
,"@sap/xsenv": "latest"
,"@sap-cloud-sdk/http-client": "latest"
,"@sap-cloud-sdk/connectivity": "latest"
,"@sap-cloud-sdk/resilience": "latest"
,"async-retry": "latest"
}
}
source: |
const debug = require('debug')('{{ .Values.services.srv.name }}:function');
const NOT_FOUND = 'Not Found';
const xsenv = require('@sap/xsenv');
const services = xsenv.getServices({
sm: { label: 'service-manager', name: 'saas-sm' }
,
dest: { label: 'destination' }
});
console.log('saas-sm: ', services.sm);
const readServices = xsenv.readServices();
console.log('readServices: ', readServices);
const httpClient = require('@sap-cloud-sdk/http-client');
const cloudSdkConnectivity = require('@sap-cloud-sdk/connectivity');
const { retrieveJwt, decodeJwt, Destination } = require('@sap-cloud-sdk/connectivity');
const { setGlobalLogLevel, createLogger } = require('@sap-cloud-sdk/util');
const { retry } = require ('@sap-cloud-sdk/resilience');
const { resilience } = require ('@sap-cloud-sdk/resilience');
const ResilienceOptions = {
retry: 10,
circuitBreaker: false,
timeout: 300*1000 // 5 minutes in milliseconds
};
const retryme = require('async-retry');
setGlobalLogLevel('debug');
const logger = createLogger('http-logs');
module.exports = {
main: async function (event, context) {
const req = event.extensions.request;
const message = `Hello World`
+ ` from the Kyma Function ${context['function-name']}`
+ ` running on ${context.runtime}!`
+ ` with the request headers ${JSON.stringify(req.headers,0,2)}`;
console.log(message);
if (typeof req.path !== undefined) {
console.log('path: ', JSON.stringify(req.path,0,2))
}
if (typeof req.params !== undefined) {
console.log('params: ', JSON.stringify(req.params,0,2))
}
if (typeof req.url !== undefined) {
console.log('url: ', JSON.stringify(req.url,0,2))
}
if (typeof req.authInfo !== undefined) {
console.log('authInfo: ', JSON.stringify(req.authInfo,0,2))
}
const { pathname } = new URL(req.url || '', `https://${req.headers.host}`)
console.log('pathname: ', pathname)
const url = require("url");
var url_parts = url.parse(req.url);
console.log(url_parts);
console.log(url_parts.pathname);
// returns an array with paths
let path_array = req.url.match('^[^?]*')[0].split('/').slice(1);
console.log(path_array)
console.log(req.url.match('^[^?]*')[0])
if (!path_array?.length) return 'Please use an API verb';
const actions = [
{ name: 'offerings', verb: 'service_offerings', dest: 'saas-sm', url: '/v1/' },
{ name: 'plans', verb: 'service_plans', dest: 'saas-sm', url: '/v1/' },
{ name: 'instances', verb: 'service_instances', dest: 'saas-sm', url: '/v1/' },
{ name: 'bindings', verb: 'service_bindings', dest: 'saas-sm', url: '/v1/' },
{ name: 'instanceDestinations', verb: 'instanceDestinations', dest: 'faas-dest-x509', url: '/destination-configuration/v1/' },
{ name: 'subaccountDestinations', verb: 'subaccountDestinations', dest: 'faas-dest-x509' , url: '/destination-configuration/v1/' }
];
const action = actions.find( ({ name }) => name === path_array[1] )
console.log('action found: ', action)
if (path_array[0] == 'srv' && action !== undefined) {
path_array = req.url.match('^[^?]*')[0].split('/').slice(2);
console.log('path_array: ', path_array)
const queryString = req.query;
console.log('queryString: ', queryString)
const urlParams = new URLSearchParams(queryString);
const params = req.params;
console.log('params: ', params)
try {
// https://sap.github.io/cloud-sdk/docs/js/features/connectivity/destinations#service-binding-environment-variables
const endpoint = path_array[1] !== undefined ? '/' + path_array[1] : '';
console.log(endpoint)
let res = await httpClient.executeHttpRequest({ destinationName: action.dest }, {
method: 'GET',
url: action.url + action.verb + endpoint
});
return res.data;
} catch (err) {
console.log(err.stack);
return err.message;
}
}
}
}
scaleConfig:
maxReplicas: 5
minReplicas: 3
resourceConfiguration:
function:
profile: S
env: ## https://kyma-project.io/docs/kyma/latest/05-technical-reference/00-configuration-parameters/svls-02-environment-variables/#node-js-runtime-specific-environment-variables
- name: FUNC_TIMEOUT ## Specifies the number of seconds in which a runtime must execute the code.
value: '1800'
- name: REQ_MB_LIMIT ## payload body size limit in megabytes.
value: "10"
- name: DEBUG
value: '{{ .Values.services.srv.name }}:*'
- name: SERVICE_BINDING_ROOT
value: /bindings
secretMounts:
- secretName: {{ .Values.services.sm.bindingSecretName }}
mountPath: "/bindings/saas-sm"
- secretName: {{ .Values.services.dest.bindingSecretNamex509 }}
mountPath: "/bindings/faas-dest-x509"</code></pre><P> </P>2024-05-13T12:54:57.123000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/technical-user-propagation-from-jco-towards-on-premises/ba-p/13704538Technical User Propagation from JCo towards On-Premises2024-05-22T15:06:16.024000+02:00simon_luserhttps://community.sap.com/t5/user/viewprofilepage/user-id/771659<P data-unlink="true">This blog lays out how to use a technical user instead of basic authentication from <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/invoke-abap-function-modules-in-on-premise-abap-systems?locale=en-US" target="_self" rel="noopener noreferrer">JCo based on the SAP Java Buildpack in CF</A> towards on-premises.</P><P data-unlink="true"> </P><H1 id="toc-hId-885667874">Background</H1><P data-unlink="true">JCo retrieves an access token representing the technical user which is then be sent to the Connectivity service. This is similar to principal propagation, but in this case, a technical user is propagated instead of a business user. The retrieval of the access token performs the OAuth 2.0 client credentials flow, according to the token service configurations in the destination. Currently for JCo the token service generation supports basic authentication only. The token service is called from the Internet, not from the Cloud Connector.</P><P data-unlink="true"> </P><H1 id="toc-hId-689154369">Configuration</H1><P>Generally speaking, the setup as described in the <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/invoke-abap-function-modules-in-on-premise-abap-systems?locale=en-US" target="_self" rel="noopener noreferrer">documentation</A> stays the same, only the destination configuration in the Destination Service needs to be adjusted.</P><P>In the UI select the authentication type <EM><STRONG>TechnicalUserPropagation</STRONG></EM>. You now need to enter three values for:</P><UL><LI><STRONG>jco.client.tech_user_id</STRONG> - the technical user name (client ID) which is forwarded towards on-premises and used for token retrieval</LI><LI><STRONG>jco.client.tech_user_secret</STRONG> - the secret for <EM>jco.client.tech_user_id</EM> used for token retrieval</LI><LI><STRONG>jco.client.tech_user_service_url</STRONG> - the URL of the token service<SPAN>, against which the token exchange is performed</SPAN></LI></UL><H2 id="toc-hId-621723583"><SPAN>Example</SPAN></H2><P><SPAN>We are going to use the token of the XSUAA service instance here. We specified for the instance in the configuration JSON the <STRONG>xsappname</STRONG> as <EM>jco-technicalProp</EM>.</SPAN></P><P><SPAN>After the application binding we can retrieve the relevant parameters from the CF environment variables VCAP_SERVICES:</SPAN></P><P> </P><P> </P><pre class="lia-code-sample language-json"><code>"clientid": "sb-jco-technicalProp!t77058"
"clientsecret": "TMsePptYQLSRf6qUWWt+l1D0rUQ="
"url": "https://cf.authentication.hana.ondemand.com"</code></pre><P> </P><P> </P><P><SPAN>Entering it in the Destination Service:</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Properties" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/113368iDC4EDC134023C774/image-size/medium?v=v2&px=400" role="button" title="simon_luser_0-1716286606143.png" alt="simon_luser_0-1716286606143.png" /></span></P><P><SPAN>The token will now be forwarded to the Cloud Connector. Assuming all necessary basic <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/configuring-principal-propagation?locale=en-US" target="_self" rel="noopener noreferrer">steps</A> for principal propagation are configured, we can <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/configure-subject-patterns-for-principal-propagation?locale=en-US" target="_self" rel="noopener noreferrer">configure a pattern</A> to extract its name for the short-lived certificate:</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Pattern" style="width: 259px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/112153iE8E7F78470E681B7/image-dimensions/259x107?v=v2" width="259" height="107" role="button" title="simon_luser_1-1715949812665.png" alt="simon_luser_1-1715949812665.png" /></span></P><P><SPAN>The ABAP backend needs to <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/cloud-connector-configure-principal-propagation-for-rfc?locale=en-US&version=Cloud#2.-map-short-lived-certificates-to-users" target="_self" rel="noopener noreferrer">maintain a user mapping</A> for this technical user, in this case mapping it to the ABAP user <EM>SKYWALKER</EM>:</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Mapping" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/113369iC19FACFAECE438B4/image-size/medium?v=v2&px=400" role="button" title="simon_luser_1-1716286913724.png" alt="simon_luser_1-1716286913724.png" /></span></P><P><SPAN>That's it!</SPAN></P>2024-05-22T15:06:16.024000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/announcing-the-new-quot-in-metro-quot-disaster-recovery-solution-for-sap/ba-p/13904013Announcing the New "In-Metro" Disaster Recovery Solution for SAP BTP2024-10-18T17:27:59.877000+02:00NiklasSiemerhttps://community.sap.com/t5/user/viewprofilepage/user-id/11942<P><FONT size="5"><STRONG>Overview</STRONG></FONT></P><P>We’re excited to unveil the latest enhancement to <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Business+Technology+Platform/pd-p/73555000100700000172" class="lia-product-mention" data-product="1215-1">SAP Business Technology Platform</a> (SAP BTP):<BR />The <STRONG>In-Metro Disaster Recovery (DR) </STRONG>solution.</P><P>This solution is designed to protect you against disasters affecting a single Availability Zone (AZ) with contractually committed SLAs RPO and RTO, offering enhanced resilience and uninterrupted operations for your cloud services.</P><P><STRONG> </STRONG></P><P><FONT size="5"><STRONG>What is "In-Metro" DR for SAP BTP?</STRONG></FONT></P><P>The <STRONG>In-Metro DR solution</STRONG> is built to protect against local disasters by leveraging a Multi-AZ setup. It ensures that, in the event of a single AZ disaster, which is defined by SAP, services remain operational, data is protected, and business continues without significant downtime.</P><P>The key metrics are:</P><UL><LI><STRONG>RPO (Recovery Point Objective): 5 minutes</STRONG> – Ensuring that data can be recovered with a maximum of 5 minutes' loss in case of a disaster.</LI><LI><STRONG>RTO (Recovery Time Objective): 2 hours</STRONG> – Ensuring that the full system is restored and operational within 2 hours of an incident.</LI></UL><P> </P><P><FONT size="5"><STRONG>The Power of Multi-AZ Architecture</STRONG></FONT></P><P>At the heart of <STRONG>In-Metro DR</STRONG> is the <STRONG>Multi-AZ (Multi Availability Zone)</STRONG> architecture, ensuring that your applications and databases are spread across different zones to safeguard against single-point failures.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="multiAZ.png" style="width: 454px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/180827i665C5E45AE1129E4/image-size/large?v=v2&px=999" role="button" title="multiAZ.png" alt="multiAZ.png" /></span></P><P>This includes:</P><UL><LI><STRONG>Active-active applications across 3 AZs</STRONG>: Applications are distributed across three AZs, with real-time data replication ensuring that if one AZ fails, the others automatically take over without impacting availability.</LI><LI><STRONG>Active-passive databases across 2 AZs</STRONG>: Databases are set up in active-passive mode, with a failover mechanism in place to switch operations to a backup AZ if the primary one fails.</LI></UL><P>Through automatic failover, <STRONG>load balancing</STRONG>, and <STRONG>failure detection</STRONG>, the solution ensures that services stay online seamlessly. Internal stress tests, such as regular “Chaos Day” exercises, further reinforce the reliability of this DR solution.</P><P> </P><P><FONT size="5"><STRONG>Availability and Scope</STRONG></FONT></P><P><STRONG> </STRONG>As of now, the <STRONG>In-Metro DR solution</STRONG> is not available for all SAP BTP services. While it already covers a wide range of services, its scope will continue to expand over time as we improve coverage and extend it to additional SAP BTP services. <STRONG>The services in scope will be regularly updated</STRONG> in the corresponding documents.</P><P>In-Metro DR is specifically designed for <STRONG>SAP-managed scenarios</STRONG>, meaning that customers using SAP BTP under SAP’s management can take advantage of the In-Metro DR setup without additional configuration or costs. However, for <STRONG>customer-managed scenarios</STRONG>, such as <STRONG>side-by-side extensions</STRONG>, the customer is responsible for configuring it accordingly (e.g. deploy the apps with multiple instances or configure data replicas on the persistency level).</P><P> </P><P><FONT size="5"><STRONG> </STRONG><STRONG>DR Planning and Regular Testing</STRONG></FONT></P><P><STRONG> </STRONG>To ensure the highest levels of reliability:</P><UL><LI>The <STRONG>DR plan</STRONG> is <STRONG>updated every 12 months</STRONG>, ensuring that it incorporates the latest technology and best practices.</LI><LI>A <STRONG>DR test is conducted at least once a year</STRONG> to verify that the solution can meet its RPO and RTO commitments under real-world conditions.</LI></UL><P>The <STRONG>In-Metro DR solution</STRONG> currently supports SAP BTP regions hosted on both <STRONG>AWS</STRONG> and <STRONG>Azure</STRONG> cloud infrastructures, providing flexibility for your organization’s cloud setup.</P><P> </P><P><FONT size="5"><STRONG> </STRONG><STRONG>Next Steps</STRONG></FONT></P><P><STRONG> </STRONG>By leveraging <STRONG>In-Metro DR</STRONG> within SAP-managed scenarios, you can trust that your critical data and services are protected with cutting-edge resilience, without the need for extra investment. For customer-managed scenarios, setting up corresponding HA and DR solutions will ensure your setup is equally resilient.</P><P>To explore which services are already covered and get all information, check the <A href="https://www.sap.com/about/agreements/policies/cloud-service-specifications.html?sort=latest_desc&search=BTP%20&pdf-asset=9c2f4166-177f-0010-bca6-c68f7e60039b&page=1" target="_blank" rel="noopener noreferrer">description</A> in SAP Trust Center<STRONG>.</STRONG></P><P>Alternatively, you can re-watch this deep dive: <A href="https://www.youtube.com/watch?v=WELcoYEQ0F0" target="_blank" rel="noopener nofollow noreferrer">Watch the Webinar about SAP BTP High Availability and Disaster Recovery</A>.</P><P> </P>2024-10-18T17:27:59.877000+02:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-cloud-foundry-python-and-cloud-connector-http/ba-p/13965916SAP Cloud Foundry - Python and Cloud Connector - HTTP2024-12-17T16:17:56.738000+01:00felixbartlerhttps://community.sap.com/t5/user/viewprofilepage/user-id/4997<DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV><DIV class=""><DIV class=""><DIV class=""><SPAN>SAP Cloud Foundry enables developers to create full-stack applications with seamless backend integration to on-premise systems. This blog explains how to use Python to connect to on-premise resources through the SAP Cloud Connector. Python is the preferred language in the AI ecosystem, making it increasingly important for developing intelligent agents. For instance, we may want our agent to access APIs in an S4HANA system. With the Cloud Connector, this can be done securely within the enterprise environment.</SPAN></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV><H2 id="toc-hId-1077583592">Access HTTP-based resources:</H2><DIV class=""><DIV><DIV class=""><DIV class=""><DIV class=""><SPAN>In this scenario, we want to connect to an HTTP-based API, such as a RESTful API or an OData service, using Python in SAP Cloud Foundry. To do this, we need to set up the SAP Cloud Connector.</SPAN></DIV></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>For this demonstration, we will use a simple "Hello World" server running locally on my computer. The goal is to access this local server from the SAP Cloud Foundry runtime through the Cloud Connector. This setup will show how to bridge cloud applications with on-premise resources.</P></DIV></DIV></DIV></DIV></DIV></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_9-1734447079352.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/202767iFF24FE75D97E3D7A/image-size/large?v=v2&px=999" role="button" title="felixbartler_9-1734447079352.png" alt="felixbartler_9-1734447079352.png" /></span></P><P class="">Szenario Architecture</P><H3 id="toc-hId-1010152806">Prerequisite:</H3><P><SPAN>Before proceeding with the steps outlined in this guide, it is essential to have an instance of the SAP Cloud Connector installed. While it is possible to install the cloud connector on a server, for the purposes of this demonstration, we will be using a Windows machine. We recommend following the instructions provided in this blog (</SPAN><A href="https://blogs.sap.com/2021/09/05/installation-and-configuration-of-sap-cloud-connector/" target="_new" rel="noopener noreferrer">https://blogs.sap.com/2021/09/05/installation-and-configuration-of-sap-cloud-connector/</A><SPAN>) to install and configure the cloud connector.</SPAN><BR /><BR /><SPAN>Second requirement is a BTP subaccount with a Cloud Foundry Environment. To this subaccount we will connect the Cloud Connector.</SPAN></P><H3 id="toc-hId-813639301">1. Cloud Connector Configuration:</H3><P><BR /><SPAN>The first step is to create a configuration in the Cloud Connector that connects to our subaccount and exposes the HTTP resource. For the purpose of this demonstration, I ran a small Node.js server on my Windows machine that outputs "Hello World".</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_1-1734443094716.png" style="width: 472px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/202729i0A9C7FA6B756AAA3/image-dimensions/472x222?v=v2" width="472" height="222" role="button" title="felixbartler_1-1734443094716.png" alt="felixbartler_1-1734443094716.png" /></span></P><P class="lia-align-center" style="text-align: center;">Localhost Example Server</P><P><BR /><SPAN>To create the configuration, navigate to the admin interface for the cloud connector and create a "Cloud to On-Premise" configuration.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_2-1734443094716.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/202730i2D2B996D3498FF2E/image-size/large?v=v2&px=999" role="button" title="felixbartler_2-1734443094716.png" alt="felixbartler_2-1734443094716.png" /></span></P><P class="">Cloud To On-Premise Configuration</P><P><BR /><SPAN>In the screenshot above, you can see that I exposed the internal host "localhost" with port 3333 via a virtual host called "virtualhost". This virtual host is the host that we will be requesting from the BTP side. For the time being, I exposed all paths using an unrestricted access policy, but in production scenarios, access policies can be defined more granularly.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_3-1734443094718.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221105i3B7B98B787F901CD/image-size/large?v=v2&px=999" role="button" title="felixbartler_3-1734443094718.png" alt="felixbartler_3-1734443094718.png" /></span></P><P class="lia-align-center" style="text-align: center;">BTP Registered Cloud Connectors</P><P><SPAN>On the BTP end, we can check the cockpit and the connected cloud connectors in the respective menu tab. If you cannot see this tab, you may be missing some roles. It is important to note that we see the LocationID "FELIXLAPTOP", which is an identifier that distinguishes multiple cloud connectors connected to the same subaccount.</SPAN></P><H3 id="toc-hId-617125796">2. Create Connectivity Service instance:</H3><DIV class=""><DIV><DIV class=""><DIV class=""><DIV class=""><SPAN>To use the Cloud Connector from our runtime environment, we first need a connectivity service instance. Here’s how to do it:</SPAN></DIV></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>In the <STRONG>BTP Cockpit</STRONG>, go to your desired <STRONG>Subaccount</STRONG> and create a new service instance, as shown below.</P></DIV></DIV></DIV></DIV></DIV></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_7-1734443863200.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/202738i6D002693AC6BF948/image-size/medium?v=v2&px=400" role="button" title="felixbartler_7-1734443863200.png" alt="felixbartler_7-1734443863200.png" /></span></P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>We use the <STRONG>"Connectivity Service"</STRONG> with the plan <STRONG>"lite"</STRONG>. Give the service instance a name, assign it to a <STRONG>space</STRONG>, and click <STRONG>create</STRONG>.</P></DIV></DIV></DIV></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_8-1734443870810.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/202739iD0B2DF4F1B1F6C14/image-size/medium?v=v2&px=400" role="button" title="felixbartler_8-1734443870810.png" alt="felixbartler_8-1734443870810.png" /></span></P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>The important credentials are stored in a <STRONG>service key</STRONG>. To get these credentials, we create a service key.</P></DIV></DIV></DIV></DIV><P> </P><P> </P><pre class="lia-code-sample language-python"><code>{
"clientid": "sb-sampleclientid!b3008|connectivity!b137",
"clientsecret": "****-****-****-****",
"url": "https://tenant_name.authentication.sap.hana.ondemand.com",
"identityzone": "sample-zone",
"tenantid": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantmode": "dedicated",
"verificationkey": "-----BEGIN PUBLIC KEY-----\nXXXXXX...\n-----END PUBLIC KEY-----",
"xsappname": "sampleappname!b3008|connectivity!b137",
"uaadomain": "authentication.sap.hana.ondemand.com",
"credential-type": "binding-secret",
"onpremise_proxy_host": "connectivityproxy.internal.cf.sap.hana.ondemand.com",
"onpremise_proxy_http_port": "20003",
"onpremise_proxy_ldap_port": "20001",
"onpremise_proxy_port": "20003",
"onpremise_proxy_rfc_port": "20001",
"onpremise_socks5_proxy_port": "20004",
"token_service_domain": "authentication.sap.hana.ondemand.com",
"token_service_url": "https://tenant_name.authentication.sap.hana.ondemand.com"
}</code></pre><P> </P><P> </P><P>We now have a set of credentials, as shown above. The key details are:</P><OL><LI><P><STRONG>OAuth Credentials</STRONG>: These include the <STRONG>"clientid"</STRONG>, <STRONG>"clientsecret"</STRONG>, and <STRONG>"url"</STRONG>. They are used to authenticate when accessing the proxy.</P></LI><LI><P><STRONG>Proxy Details</STRONG>: These include the <STRONG>"onpremise_proxy_host"</STRONG> and the various ports, such as <STRONG>"onpremise_proxy_port"</STRONG>, <STRONG>"onpremise_proxy_http_port"</STRONG>, and <STRONG>"onpremise_socks5_proxy_port"</STRONG>. These details are configured as the proxy to route traffic. The proxy securely tunnels requests through the Cloud Connector to the on-premise destination.</P></LI></OL><H3 id="toc-hId-420612291">3. Developing a Cloud Foundry App:</H3><P>Now let’s put this together in a simple Python example to perform an actual HTTP request:</P><P>The Python script will send a request using Python's standard <STRONG>requests</STRONG> library. We use the connection details provided by the Connectivity Service. To route the traffic through the Cloud Connector, we specify the proxy configuration, including the <STRONG>host</STRONG>, <STRONG>port</STRONG>, and the <STRONG>proxy-authentication header</STRONG>.</P><P> </P><P> </P><pre class="lia-code-sample language-python"><code>import requests
# Connectivity Service Service Key
connectivity_service_key = {
"clientid": "sb-sampleclientid!b3008|connectivity!b137",
"clientsecret": "****-****-****-****",
"url": "https://tenant_name.authentication.sap.hana.ondemand.com",
"identityzone": "sample-zone",
"tenantid": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantmode": "dedicated",
"verificationkey": "-----BEGIN PUBLIC KEY-----\nXXXXXX...\n-----END PUBLIC KEY-----",
"xsappname": "sampleappname!b3008|connectivity!b137",
"uaadomain": "authentication.sap.hana.ondemand.com",
"credential-type": "binding-secret",
"onpremise_proxy_host": "connectivityproxy.internal.cf.sap.hana.ondemand.com",
"onpremise_proxy_http_port": "20003",
"onpremise_proxy_ldap_port": "20001",
"onpremise_proxy_port": "20003",
"onpremise_proxy_rfc_port": "20001",
"onpremise_socks5_proxy_port": "20004",
"token_service_domain": "authentication.sap.hana.ondemand.com",
"token_service_url": "https://tenant_name.authentication.sap.hana.ondemand.com"
}
# Target Application Details (replace with your app information)
application_host = "virtualhost"
application_port = 3333
application_path = "/hello"
location_id = "FELIXLAPTOP" # Adjust to match your Cloud Connector location
def get_connectivity_service_token(client_id, client_secret, token_service_url):
"""
Fetches an OAuth token from the SAP Connectivity Service.
"""
response = requests.post(
url=token_service_url,
params={"grant_type": "client_credentials"},
auth=(client_id, client_secret)
)
if response.status_code != 200:
print(f"Error: {response.status_code} - {response.text}")
exit(-1)
return response.json().get("access_token")
def example_http_request(host, port, path, auth_token, location_id, proxy_host):
"""
Performs an HTTP GET request through SAP Cloud Connector.
"""
url = f"http://{host}:{port}{path}"
headers = {
"Proxy-Authorization": f"Bearer {auth_token}",
"SAP-Connectivity-SCC-Location_ID": location_id
}
proxies = {"http": proxy_host}
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
return response
# Fetch OAuth Token
print("Fetching OAuth token...")
token = get_connectivity_service_token(
connectivity_service_key["clientid"],
connectivity_service_key["clientsecret"],
connectivity_service_key["token_service_url"] + "/oauth/token"
)
print("Token acquired successfully.")
# Build proxy URL
proxy_host = "http://" + connectivity_service_key["onpremise_proxy_host"] + ":" + connectivity_service_key["onpremise_proxy_port"]
# Perform HTTP Request
print("Sending HTTP request through SAP Cloud Connector...")
response = example_http_request(application_host, application_port, application_path, token, location_id, proxy_host)
print("Response received:")
print(response.content.decode("utf-8"))
print("Script execution completed.")</code></pre><P> </P><P> </P><DIV class=""><DIV><DIV class=""><DIV class=""><DIV class=""><SPAN>First, we obtain a token from the </SPAN><STRONG>OAuth 2.0 Token Service URL</STRONG><SPAN>. This is done using the get_connectivity_service_token function, where we send the necessary credentials.</SPAN></DIV></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><BLOCKQUOTE><P><STRONG>Note</STRONG>: Make sure to add <STRONG>/oauth/token</STRONG> at the end of the Token Service URL.</P></BLOCKQUOTE><P>The response will return a <STRONG>Bearer Token</STRONG>, which we need to perform the actual HTTP request.</P><P>In the example_http_request function, we use Python's <STRONG>requests</STRONG> library to send the request. The <STRONG>proxies</STRONG> option allows us to route the traffic through the Cloud Connector's HTTP proxy. For this, we:</P><UL><LI>Combine the <STRONG>proxy_host</STRONG> (connectivity service proxy host) and <STRONG>port</STRONG> (e.g., HTTP port).</LI><LI>For other traffic types, such as TCP-based traffic, we would use the <STRONG>SOCKS5 port</STRONG>.</LI></UL><P>We also include important headers:</P><UL><LI><STRONG>Proxy-Authorization</STRONG>: This includes the <STRONG>Bearer Token</STRONG> ("Bearer <token>").</LI><LI><STRONG>SAP-Connectivity-Location-ID</STRONG>: This optional header specifies the location ID of the connected Cloud Connector. For example, if my Cloud Connector is connected under <STRONG>"FELIXLAPTOP"</STRONG>, I include this value.</LI></UL><P>The actual destination URL points to the <STRONG>virtual host</STRONG> and <STRONG>virtual port</STRONG> configured in the Cloud Connector. For this example:</P><UL><LI><STRONG>virtualhost:3333</STRONG> communicates with my local server.</LI><LI>The path /hello returns a sample message.</LI></UL><P>Finally, we combine all steps into a simple sequential script to demonstrate the entire flow.</P></DIV></DIV></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>To make it deployable on Cloud Foundry, we add a standard manifest.yaml file.</P></DIV></DIV></DIV></DIV><P> </P><pre class="lia-code-sample language-yaml"><code>---
applications:
- name: cloud_connector_test_task
memory: 128MB
buildpack: python_buildpack
command: python app.py</code></pre><P> </P><P>It sets the buildpack to <STRONG>python_buildpack</STRONG>.</P><P>Additionally, we include a <STRONG>requirements.txt</STRONG> file in the directory.</P><P> </P><pre class="lia-code-sample language-abap"><code>requests</code></pre><P> </P><P>Ending up with the following structure:</P><P> </P><pre class="lia-code-sample language-abap"><code>my-python-cloud-connector-app/
│
├── manifest.yaml
├── requirements.txt
├── app.py (or your main Python script)</code></pre><P> </P><P><STRONG>Note:</STRONG> The script we created obviously does not run on our local environment. Because a) we cannot connect to the connectivity service from outside of the BTP and b) the destination URL is not reachable from our local environment. In this blog, I show how to use a hybrid testing setup to develop against backend resources that are behind the cloud connector.</P><H3 id="toc-hId-224098786">4. Testing the Application:</H3><P class="">Now lets deploy using the following command:</P><P> </P><pre class="lia-code-sample language-abap"><code>cf push cloud_connector_test_task --task</code></pre><P> </P><P>You push your script as a task (one-time executable) to the Cloud Foundry space. Then, you start the task using the following command:</P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>cf run-task cloud_connector_test_task --command "python app.py" --name example_task
cf logs cloud_connector_test_task --recent</code></pre><P> </P><P>This will show the logs from the latest task execution. It may take a few seconds for the task to start and complete.</P><P>In the logs, if everything worked correctly, you should see the <STRONG>"Hello World"</STRONG> message from your <STRONG>on-premises</STRONG> PC, confirming that the connection through the Cloud Connector was successful.</P><P> </P><P> </P><pre class="lia-code-sample language-python"><code>2024-12-17T15:25:11.52+0100 [APP/TASK/example_task/0] OUT Fetching OAuth token...
2024-12-17T15:25:11.69+0100 [APP/TASK/example_task/0] OUT Token acquired successfully.
2024-12-17T15:25:11.69+0100 [APP/TASK/example_task/0] OUT Sending HTTP request through SAP Cloud Connector...
2024-12-17T15:25:13.66+0100 [APP/TASK/example_task/0] OUT Response received:
2024-12-17T15:25:13.66+0100 [APP/TASK/example_task/0] OUT {"message":"Hello World 2024-12-17T14:25:13.444Z"}
2024-12-17T15:25:13.66+0100 [APP/TASK/example_task/0] OUT Script execution completed.</code></pre><P> </P><P><SPAN>That means we have successfully established connectivity via the cloud connector and made a HTTP request.</SPAN><BR /><BR /><SPAN>In the next blog I will show how to </SPAN><A href="https://blogs.sap.com/2023/04/14/sap-data-intelligence-python-operators-and-cloud-connector-tcp/" target="_blank" rel="noopener noreferrer">create a TCP socket in Python to connect to TCP resources</A><SPAN>.</SPAN><BR /><BR /><SPAN>Hope you find the content of this blog helpful. Feel free to comment for further clarifications.</SPAN></P>2024-12-17T16:17:56.738000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/hybrid-local-development-with-sap-cloud-foundry-access-on-premises-apis-via/ba-p/13967660Hybrid Local Development with SAP Cloud Foundry: Access On-Premises APIs via the Cloud Connector2024-12-18T22:15:21.226000+01:00felixbartlerhttps://community.sap.com/t5/user/viewprofilepage/user-id/4997<P>When building full-stack applications on SAP BTP, debugging against on-premise backends is a common requirement. This post outlines a simple method to simulate the connectivity available in the BTP Cloud Foundry runtime on your local machine, enabling access to on-premise APIs through the BTP Subaccount and Cloud Connector.</P><H1 id="toc-hId-948557721">Scenario:</H1><P>Imagine you're developing an AI Agent and need to create tools that interact with an on-premise API. In line with SAP best practices, this API is exposed to your Subaccount via the Cloud Connector. While deployed applications can access the API directly, how do you test this setup locally?</P><P>The solution is to use the Cloud Foundry CLI tooling to establish a tunnel to the Cloud Foundry environment, routing traffic through it. This allows local development and debugging as though you're working directly within the BTP runtime.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_2-1734523656039.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/203299i2E012EF07437D17C/image-size/large?v=v2&px=999" role="button" title="felixbartler_2-1734523656039.png" alt="felixbartler_2-1734523656039.png" /></span></P><H2 id="toc-hId-881126935">Concept: SAP Cloud Connector:</H2><P>The SAP Cloud Connector (SCC) acts as a secure bridge between on-premise systems and cloud applications. It allows cloud applications, such as those running on SAP BTP (Business Technology Platform), to access resources in on-premise environments securely. The connector ensures data transfer via encrypted communication, maintaining the integrity and confidentiality of sensitive information. It supports fine-grained access control, enabling administrators to define which systems, services, or data can be exposed to the cloud. Additionally, SCC simplifies integration by avoiding the need for complex network configurations like VPNs. This makes it a critical tool for hybrid cloud setups, enabling seamless and secure connectivity.</P><H2 id="toc-hId-684613430">Example Setup:</H2><P>For this example, I configured a Cloud Connector on a machine and exposed an HTTP-based sample server. You can refer to this detailed blog post <A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-cloud-foundry-python-and-cloud-connector-http/ba-p/13965916#M177764" target="_new"><SPAN>here</SPAN></A> to see the process outlined in Step 1.</P><P>The setup results in the virtualhost:3333 being securely exposed to my BTP Subaccount.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="hybrid.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221101i7140FD3F9E172DE5/image-size/large?v=v2&px=999" role="button" title="hybrid.png" alt="hybrid.png" /></span></P><P>Taking the script from that blog as an example, I make an HTTP request to the exposed virtualhost:3333:</P><P> </P><pre class="lia-code-sample language-python"><code>def example_http_request(host, port, path, auth_token, location_id, proxy_host):
"""
Performs an HTTP GET request through SAP Cloud Connector.
"""
url = f"http://{host}:{port}{path}"
headers = {
"Proxy-Authorization": f"Bearer {auth_token}",
"SAP-Connectivity-SCC-Location_ID": location_id
}
proxies = {"http": proxy_host} response = requests.get(url, headers=headers, proxies=proxies, verify=False)
return response</code></pre><P> </P><P> </P><DIV><P>Doing the request on BTP, we receive the expected "Hello World" response. Running the same request on my local machine, however, would result in a connection error, as the on-premise API is not directly accessible from the local environment.</P></DIV><P> </P><pre class="lia-code-sample language-python"><code>An error occurred: HTTPConnectionPool(host='connectivityproxy.internal.cf.sap.hana.ondemand.com', port=20003): Max retries exceeded with url: http://virtualhost:3333/hello (Caused by ProxyError('Unable to connect to proxy', ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x00000191F0BFF6B0>, 'Connection to connectivityproxy.internal.cf.sap.hana.ondemand.com timed out. (connect timeout=None)')))</code></pre><P> </P><P><STRONG>Note</STRONG>: No surprise there, as the connectivity proxy is an internal host: connectivityproxy.<STRONG>internal</STRONG>.cf.sap.hana.ondemand.com.</P><P> </P><DIV class=""><DIV><DIV class=""><DIV class=""><H2 id="toc-hId-488099925"><STRONG>Setting Up a Tunnel to a Sample Application</STRONG></H2></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>There’s a light at the end of the tunnel: the Cloud Foundry Command Line Interface offers the ability to create an <STRONG>SSH tunnel</STRONG> for deployed apps, as described in the documentation <A href="https://docs.cloudfoundry.org/devguide/deploy-apps/ssh-services.html" target="_new" rel="noopener nofollow noreferrer"><SPAN>here</SPAN></A>. This feature can be useful in various scenarios. One example is accessing a database deployed within the environment, which is not exposed to the outside world—only your internal apps can access its ports. Another example is our case: developing locally against an on-premise backend.</P><P>However, this can only be done in relation to an app. You can either use your own existing app or a sample dummy app. In this case, I’ll use a sample app, which I’ve named <EM>myapp</EM>, based on the code available <A href="https://github.com/ihuston/python-cf-examples/tree/master/01-simple-python-app" target="_new" rel="noopener nofollow noreferrer"><SPAN>here</SPAN></A>.</P><P>After quickly running <STRONG>cf push</STRONG>, the deployment is successfully completed.</P></DIV></DIV></DIV></DIV></DIV></DIV><P> </P><pre class="lia-code-sample language-python"><code>Waiting for app myapp to start...Instances starting...
Instances starting...
Instances starting...
Instances starting...name: myapp
requested state: started
routes: myapp-brash-warthog-cj.cfapps.sap.hana.ondemand.com
last uploaded: Wed 18 Dec 21:43:35 CET 2024
stack: cflinuxfs4
buildpacks:
name version detect output buildpack name
python_buildpack 1.8.30 python pythontype: web
sidecars:
instances: 1/1
memory usage: 128M
start command: python hello.py
state since cpu memory disk details
#0 running 2024-12-18T20:43:49Z 0.0% 0 of 0 0 of 0</code></pre><P> </P><P><SPAN>Having deployed the app we can then establish the SSH tunnel using the following command:</SPAN></P><P> </P><pre class="lia-code-sample language-abap"><code>cf ssh -L 8888:connectivityproxy.internal.cf.sap.hana.ondemand.com:20003 myapp</code></pre><P> </P><P>Lets break this down:</P><UL><LI><STRONG>cf</STRONG>: Refers to the Cloud Foundry CLI.</LI><LI><STRONG>ssh</STRONG>: Invokes the SSH feature of the Cloud Foundry CLI.</LI><LI><STRONG>-L 8888:connectivityproxy.internal.cf.sap.hana.ondemand.com:20003</STRONG>:<BR />This specifies the SSH tunnel with the following parts:<UL><LI>8888: The local port on your machine where the tunnel will be accessible.</LI><LI>connectivityproxy.internal.cf.sap.hana.ondemand.com: The target host inside the Cloud Foundry environment.</LI><LI>20003: The target port on the remote host within the Cloud Foundry environment.</LI></UL></LI><LI><STRONG>myapp</STRONG>: The name of the application you want to connect to via SSH.</LI></UL><P>Essentially that leaves us with a tunnel that is reachable from localhost:8888 - forwarding our traffic to the internal connectivity proxy host at its http proxy port 20003.</P><P>Running the ssh tunnel command now gives us access to the runtime environment of the app:</P><P> </P><pre class="lia-code-sample language-abap"><code>PS C:\Github\sap-cloud-foundry-python-cloud-connector> cf ssh -L 8888:connectivityproxy.internal.cf.sap.hana.ondemand.com:20003 myapp
vcap@3e707408-4eca-41f4-7dee-d848:~$ ls
app deps logs profile.d staging_info.yml tmp
vcap@3e707408-4eca-41f4-7dee-d848:~$
vcap@3e707408-4eca-41f4-7dee-d848:~$</code></pre><P> </P><H2 id="toc-hId-291586420">Running the Local Script via the Tunnel</H2><P>While the SSH session is active, the tunnel remains open. However, there’s a small adjustment we need to make: instead of using connectivityproxy.internal... as our proxy host URL, <STRONG>we must reference localhost:8888</STRONG>. This requires updating the corresponding value in the secret. Once that’s done, we can run the script seamlessly—whether through a debugger or by executing it with the Python interpreter in a separate command-line process. It should now work as expected.</P><P> </P><pre class="lia-code-sample language-python"><code>PS C:\Github\sap-cloud-foundry-python-cloud-connector> python app.py
Fetching OAuth token...
Token acquired successfully.
Sending HTTP request through SAP Cloud Connector...
Response received:
{"message":"Hello World 2024-12-18T20:46:49.181Z"}
Script execution completed.</code></pre><P> </P><P>Great! We've seen how to connect to on-premise systems from our local environment using the cf ssh tunneling options to route traffic through the Cloud Connector.</P><P>This approach works for both HTTP and TCP traffic. Feel free to check out my other blog on how to proxy TCP traffic using Python.</P>2024-12-18T22:15:21.226000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-cloud-foundry-python-and-cloud-connector-tcp/ba-p/13967140SAP Cloud Foundry - Python and Cloud Connector - TCP2024-12-19T09:35:58.651000+01:00felixbartlerhttps://community.sap.com/t5/user/viewprofilepage/user-id/4997<P>The Transmission Control Protocol (TCP) is a widely used protocol that provides a reliable and ordered delivery of data between applications running on different hosts. It serves as the foundation for many technologies and plays a crucial role in modern IT infrastructure.</P><P>SAP Cloud Foundry is the Platform-as-a-service offering on BTP to build all kinds of Apps, Integration and nowadays also AI functionalities. </P><P>In this blog post, we will walk you through the process of establishing connectivity to an on-premises TCP-based system using Python within the Cloud Foundry runtime.</P><H2 id="toc-hId-1077635573">Accessing TCP-Based Resources</H2><P><STRONG>Scenario:</STRONG> The objective is to establish a connection to a TCP-based system using Python within SAP Cloud Foundry. Many commonly used systems, such as databases like SAP HANA, PostgreSQL, and MySQL, as well as protocols like SSH and SFTP, rely on TCP for communication.</P><P>To achieve this, we will configure the Cloud Connector, a crucial tool for enabling secure communication between SAP Cloud Foundry and on-premises systems. For demonstration purposes, we will use a simple "Hello TCP" server running locally on my computer. The goal is to successfully connect to this server from within SAP Cloud Foundry using the Cloud Connector.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_0-1734560045393.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/203481i57E705B5F09FB4B3/image-size/large?v=v2&px=999" role="button" title="felixbartler_0-1734560045393.png" alt="felixbartler_0-1734560045393.png" /></span></P><H3 id="toc-hId-1010204787">Prerequisite:</H3><P>Before proceeding with the steps outlined in this guide, it is essential to have an instance of the SAP Cloud Connector installed. While it is possible to install the cloud connector on a server, for the purposes of this demonstration, we will be using a Windows machine. We recommend following the instructions provided in this blog (<A href="https://blogs.sap.com/2021/09/05/installation-and-configuration-of-sap-cloud-connector/" target="_blank" rel="noopener noreferrer">https://blogs.sap.com/2021/09/05/installation-and-configuration-of-sap-cloud-connector/</A>) to install and configure the cloud connector.<BR /><BR />The second requirement is a BTP subaccount with a Data Intelligence cluster. To this Subaccount we will connect the Cloud Connector.</P><H3 id="toc-hId-813691282">1. Configuration:</H3><P>The first step is to create a configuration in the Cloud Connector that connects to our subaccount and exposes the TCP resource. For the purpose of this demonstration, I ran a small Node.js server on my Windows machine that outputs <A href="https://gist.github.com/fyx99/cb6389e3c1942729cdbfc7ad3a9e1c71" target="_blank" rel="noopener nofollow noreferrer">"Hello TCP!"</A>.</P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-python"><code>telnet localhost 4444
Connecting to localhost ...
Hello TCP!</code></pre><P> </P><P> </P><P>To create the configuration, navigate to the admin interface for the cloud connector and create a "Cloud to On-Premise" configuration.</P><P><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/04/cloud-to-onpremise-configuration-tcp-1.png" border="0" /></P><P class="lia-align-center" style="text-align: center;">Cloud Connector configuration</P><P>In the screenshot above, you can see that I exposed the internal host "localhost" with port 4444 via a virtual host called "virtualhost". This virtual host is the host that we will be requesting from the BTP side. Compared to HTTP resources, we do not need to explicitly expose paths.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="btp-registered-cloud-connectors-tcp.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/221095i3BB0026E904C8514/image-size/large?v=v2&px=999" role="button" title="btp-registered-cloud-connectors-tcp.png" alt="btp-registered-cloud-connectors-tcp.png" /></span></P><P class="lia-align-center" style="text-align: center;">BTP Cockpit Cloud Connector Resources</P><P>On the BTP end, we can check the cockpit and the connected cloud connectors in the respective menu tab. If you cannot see this tab, you may be missing some roles. It is important to note that we see the LocationID "FELIXLAPTOP", which is an identifier that distinguishes multiple cloud connectors connected to the same subaccount.</P><H3 id="toc-hId-617177777">2. Create Connectivity Service instance:</H3><DIV class=""><DIV><DIV class=""><DIV class=""><DIV class=""><SPAN>To use the Cloud Connector from our runtime environment, we first need a connectivity service instance. Here’s how to do it:</SPAN></DIV></DIV></DIV></DIV></DIV><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>In the<SPAN> </SPAN><STRONG>BTP Cockpit</STRONG>, go to your desired<SPAN> </SPAN><STRONG>Subaccount</STRONG><SPAN> </SPAN>and create a new service instance, as shown below.</P></DIV></DIV></DIV></DIV></DIV></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_0-1734595714565.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/203558i6D1541E92A464A41/image-size/medium?v=v2&px=400" role="button" title="felixbartler_0-1734595714565.png" alt="felixbartler_0-1734595714565.png" /></span></P><P> </P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>We use the<SPAN> </SPAN><STRONG>"Connectivity Service"</STRONG><SPAN> </SPAN>with the plan<SPAN> </SPAN><STRONG>"lite"</STRONG>. Give the service instance a name, assign it to a<SPAN> </SPAN><STRONG>space</STRONG>, and click<SPAN> </SPAN><STRONG>create</STRONG>.</P></DIV></DIV></DIV></DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="felixbartler_1-1734595714545.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/203557i499A411F5EEE62FB/image-size/medium?v=v2&px=400" role="button" title="felixbartler_1-1734595714545.png" alt="felixbartler_1-1734595714545.png" /></span></P><P> </P><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>The important credentials are stored in a<SPAN> </SPAN><STRONG>service key</STRONG>. To get these credentials, we create a service key.<BR /><BR /></P></DIV></DIV></DIV></DIV><P> </P><P> </P><pre class="lia-code-sample language-python"><code>{
"clientid": "sb-sampleclientid!b3008|connectivity!b137",
"clientsecret": "****-****-****-****",
"url": "https://tenant_name.authentication.sap.hana.ondemand.com",
"identityzone": "sample-zone",
"tenantid": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantmode": "dedicated",
"verificationkey": "-----BEGIN PUBLIC KEY-----\nXXXXXX...\n-----END PUBLIC KEY-----",
"xsappname": "sampleappname!b3008|connectivity!b137",
"uaadomain": "authentication.sap.hana.ondemand.com",
"credential-type": "binding-secret",
"onpremise_proxy_host": "connectivityproxy.internal.cf.sap.hana.ondemand.com",
"onpremise_proxy_http_port": "20003",
"onpremise_proxy_ldap_port": "20001",
"onpremise_proxy_port": "20003",
"onpremise_proxy_rfc_port": "20001",
"onpremise_socks5_proxy_port": "20004",
"token_service_domain": "authentication.sap.hana.ondemand.com",
"token_service_url": "https://tenant_name.authentication.sap.hana.ondemand.com"
}</code></pre><P> </P><P> </P><P>We now have a set of credentials, as shown above. The key details are:</P><OL><LI><P><STRONG>OAuth Credentials</STRONG>: These include the<SPAN> </SPAN><STRONG>"clientid"</STRONG>,<SPAN> </SPAN><STRONG>"clientsecret"</STRONG>, and<SPAN> </SPAN><STRONG>"url"</STRONG>. They are used to authenticate when accessing the proxy.</P></LI><LI><P><STRONG>Proxy Details</STRONG>: These include the<SPAN> </SPAN><STRONG>"onpremise_proxy_host"</STRONG><SPAN> </SPAN>and the various ports, such as<SPAN> </SPAN><STRONG>"onpremise_proxy_port"</STRONG>,<SPAN> </SPAN><STRONG>"onpremise_proxy_http_port"</STRONG>, and<SPAN> </SPAN><STRONG>"onpremise_socks5_proxy_port"</STRONG>. These details are configured as the proxy to route traffic. The proxy securely tunnels requests through the Cloud Connector to the on-premise destination.</P></LI></OL><H3 id="toc-hId-420664272">3. Developing a Cloud Foundry App:</H3><P>Now let’s put this together in a simple Python example to perform an actual TCP request:</P><P>The Python script will send a request using Python's standard <STRONG><SPAN>socket </SPAN></STRONG>library. We use the connection details provided by the Connectivity Service Service Key. To route the traffic through the Cloud Connector, we specify the proxy configuration, including the<SPAN> </SPAN><STRONG>host</STRONG>,<SPAN> </SPAN><STRONG>port</STRONG>, and the<SPAN> </SPAN><STRONG>proxy-authentication header</STRONG>.</P><P>To realize the connection to the Connectivity Proxy, we will be using the <STRONG>sapcloudconnectorpythonsocket</STRONG> library I created for this purpose. This is a seperate dependency and needs to be included into the requirements file. The reason we cannot use standard library's like PySocks to connect to the connectivity service, is the <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/using-tcp-protocol-for-cloud-applications" target="_blank" rel="noopener noreferrer">custom authentication flow used</A>.</P><P>The actual script looks straightforward:</P><P> </P><P> </P><pre class="lia-code-sample language-python"><code>import requests
from sapcloudconnectorpythonsocket import CloudConnectorSocket
# Connectivity Service Service Key
connectivity_service_key = {
"clientid": "sb-sampleclientid!b3008|connectivity!b137",
"clientsecret": "****-****-****-****",
"url": "https://tenant_name.authentication.sap.hana.ondemand.com",
"identityzone": "sample-zone",
"tenantid": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"tenantmode": "dedicated",
"verificationkey": "-----BEGIN PUBLIC KEY-----\nXXXXXX...\n-----END PUBLIC KEY-----",
"xsappname": "sampleappname!b3008|connectivity!b137",
"uaadomain": "authentication.sap.hana.ondemand.com",
"credential-type": "binding-secret",
"onpremise_proxy_host": "connectivityproxy.internal.cf.sap.hana.ondemand.com",
"onpremise_proxy_http_port": "20003",
"onpremise_proxy_ldap_port": "20001",
"onpremise_proxy_port": "20003",
"onpremise_proxy_rfc_port": "20001",
"onpremise_socks5_proxy_port": "20004",
"token_service_domain": "authentication.sap.hana.ondemand.com",
"token_service_url": "https://tenant_name.authentication.sap.hana.ondemand.com"
}
# Target Application Details (replace with your app information)
application_host = "virtualhost"
application_port = 4444
location_id = "FELIXLAPTOP" # Adjust to match your Cloud Connector location
def get_connectivity_service_token(client_id, client_secret, token_service_url):
"""
Fetches an OAuth token from the SAP Connectivity Service.
"""
response = requests.post(
url=token_service_url,
params={"grant_type": "client_credentials"},
auth=(client_id, client_secret)
)
if response.status_code != 200:
print(f"Error: {response.status_code} - {response.text}")
exit(-1)
return response.json().get("access_token")
def example_tcp_request(host, port, auth_token, location_id, proxy_host, proxy_port):
"""
Performs an TCP request through SAP Cloud Connector.
"""
cc_socket = CloudConnectorSocket()
cc_socket.connect(
dest_host=host,
dest_port=port,
proxy_host=proxy_host,
proxy_port=proxy_port,
token=auth_token,
location_id=location_id
)
cc_socket.send(b"")
response = cc_socket.recv(4096)
return response
# Fetch OAuth Token
print("Fetching OAuth token...")
token = get_connectivity_service_token(
connectivity_service_key["clientid"],
connectivity_service_key["clientsecret"],
connectivity_service_key["token_service_url"] + "/oauth/token"
)
print("Token acquired successfully.")
# Perform TCP Request
print("Sending TCP request through SAP Cloud Connector...")
response = example_tcp_request(application_host, application_port, token, location_id, connectivity_service_key["onpremise_proxy_host"], int(connectivity_service_key["onpremise_socks5_proxy_port"]))
print("Response received:")
print(response)
print("Script execution completed.")</code></pre><P> </P><P> </P><P>Let’s break down the steps performed in the script:</P><OL><LI><P><STRONG>Authentication</STRONG><BR />The script begins by authenticating with the OAuth endpoint using the details from the service key in</P><DIV><DIV><STRONG>get_connectivity_service_token</STRONG><SPAN>. This step retrieves a <STRONG>Bearer Token</STRONG>, which is required to access the Connectivity Proxy.</SPAN></DIV></DIV></LI><LI><P><STRONG>Establishing the Connection</STRONG><BR />Next, the example_tcp_request function is called to send a sample request. This function establishes a connection to the target system via the SAP Cloud Connector. Under the hood, this involves multiple TCP request exchanges, during which the authentication token and location ID are passed. This process results in an open connection through the secure tunnel created by the Cloud Connector.</P></LI><LI><P><STRONG>Using the SOCKS5 Proxy Port</STRONG><BR />A key detail to note is that the script uses the SOCKS5 proxy port instead of the standard HTTP proxy port of the Connectivity Service. Looking at the service key of a Connectivity Service instance provides clarity:</P><UL><LI><STRONG>HTTP Proxy Port:</STRONG> 20003</LI><LI><STRONG>SOCKS5/TCP Proxy Port:</STRONG> 20004</LI></UL><P>The SOCKS5 port (20004) is explicitly specified when opening the socket, as it is required for TCP communication in this context.</P></LI><LI><P><STRONG>Sending and Receiving Data</STRONG><BR />With the socket successfully opened, the script sends a request to the TCP server. In this example, an empty request body is sent, and the local server should respond with "Hello TCP!" for every request.</P></LI></OL><DIV class=""><DIV class=""><DIV class=""><DIV class=""><P>To make it deployable on Cloud Foundry, we add a standard manifest.yaml file.</P></DIV></DIV></DIV></DIV><P> </P><P> </P><pre class="lia-code-sample language-yaml"><code>---
applications:
- name: cloud_connector_test_task
memory: 128MB
buildpack: python_buildpack
command: python app.py</code></pre><P> </P><P> </P><P>It sets the buildpack to<SPAN> </SPAN><STRONG>python_buildpack</STRONG>.</P><P>Additionally, we include a<SPAN> </SPAN><STRONG>requirements.txt</STRONG><SPAN> </SPAN>file in the directory.</P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>requests
sapcloudconnectorpythonsocket</code></pre><P> </P><P> </P><P> </P><P>Ending up with the following structure:</P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>my-python-cloud-connector-app/
│
├── manifest.yaml
├── requirements.txt
├── app.py (or your main Python script)</code></pre><P> </P><P> </P><P><STRONG>Note:</STRONG><SPAN> </SPAN>The script we created obviously does not run on our local environment. Because a) we cannot connect to the connectivity service from outside of the BTP and b) the destination URL is not reachable from our local environment. <A href="https://community.sap.com/t5/technology-blogs-by-sap/hybrid-local-development-with-sap-cloud-foundry-access-on-premises-apis-via/ba-p/13967660" target="_self">In this blog</A>, I show how to use a hybrid testing setup to develop against backend resources that are behind the cloud connector.</P><H3 id="toc-hId-224150767">4. Testing the Application:</H3><P class="">Now lets deploy using the following command:</P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>cf push cloud_connector_test_task --task</code></pre><P> </P><P> </P><P>You push your script as a task (one-time executable) to the Cloud Foundry space. Then, you start the task using the following command:</P><P> </P><P> </P><pre class="lia-code-sample language-abap"><code>cf run-task cloud_connector_test_task --command "python app.py" --name example_task
cf logs cloud_connector_test_task --recent</code></pre><P> </P><P> </P><P>This will show the logs from the latest task execution. It may take a few seconds for the task to start and complete.</P><P>In the logs, if everything worked correctly, you should see the<SPAN> </SPAN><STRONG>"Hello TCP!"</STRONG><SPAN> </SPAN>message from your<SPAN> </SPAN><STRONG>on-premises</STRONG><SPAN> machine</SPAN>, confirming that the connection through the Cloud Connector was successful.</P><P> </P><P> </P><pre class="lia-code-sample language-python"><code>2024-12-18T23:30:15.23+0100 [APP/TASK/example_task/0] OUT Fetching OAuth token...
2024-12-18T23:30:15.38+0100 [APP/TASK/example_task/0] OUT Token acquired successfully.
2024-12-18T23:30:15.38+0100 [APP/TASK/example_task/0] OUT Sending TCP request through SAP Cloud Connector...
2024-12-18T23:30:15.53+0100 [APP/TASK/example_task/0] OUT Response received:
2024-12-18T23:30:15.53+0100 [APP/TASK/example_task/0] OUT b'Hello TCP!'
2024-12-18T23:30:15.53+0100 [APP/TASK/example_task/0] OUT Script execution completed.</code></pre><P> </P><P> </P><P>That means we were successful and the script was able to request the local TCP server on my windows machine. Checkout my similar blogpost <A href="https://community.sap.com/t5/technology-blogs-by-sap/sap-cloud-foundry-python-and-cloud-connector-http/ba-p/13965916" target="_self">targeting a example based on HTTP.</A><BR /><BR />Hope you find the content of this blog helpful. Feel free to comment for further clarifications.</P>2024-12-19T09:35:58.651000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/consuming-external-services-odata-rest-using-destinations-configured-in-btp/ba-p/13978984Consuming external services(Odata/Rest) using destinations configured in BTP cockpit.2025-01-14T16:22:49.327000+01:00SailiRBendalehttps://community.sap.com/t5/user/viewprofilepage/user-id/1882114<P> </P><P>Hello All,</P><P>In this blog post, I will be demonstrating on how to call external services using destinations configured in Destinations in BTP cockpit.</P><P>Before we start with demonstration, I would like to provide a brief information about the type of application development that we will be following in this demo.<BR />- We will be creating a MTA application<BR />- We will use managed approuter, In order to use this, we have to enable/configure the SAP Build Workzone subscription in trial account.<BR />- We will deploy the application on cloud foundry.<BR />- We will be consuming below mentioned external services:<BR />-- <A href="https://services.odata.org/V3/Northwind/Northwind.svc/Customers?$format=json" target="_blank" rel="noopener nofollow noreferrer">https://services.odata.org/V3/Northwind/Northwind.svc/Customers?$format=json</A><BR />-- <A href="https://api.restful-api.dev/objects/4" target="_blank" rel="noopener nofollow noreferrer">https://api.restful-api.dev/objects/4</A></P><P> </P><P><STRONG>Step 1: Creating Destination in BTP subaccount.</STRONG><BR />Destinations has to be created at each subaccount level. Since, we are using Trial account for this demo, our cockpit will have only one subaccount.<BR />We have created 2 destinations as mentioned below:<BR />1. Northwind destination<BR />2. Restful API destination<BR />To create destination, follow the path Trial home -> Account Explorer (Global account) -> trial subaccount -> Connectivity -> Destinations<BR />Below are the screenshot of the Destinations created.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_0-1736750124865.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/211063i04CAFD20847F83FE/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_0-1736750124865.png" alt="SailiRBendale_0-1736750124865.png" /></span></P><P> </P><DIV class=""> </DIV><DIV class=""><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_1-1736750154657.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/211065i28E1E2029E25AFE6/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_1-1736750154657.png" alt="SailiRBendale_1-1736750154657.png" /></span><P> </P><BR /><P><STRONG>Step 2: Create new project from template</STRONG></P><P>We are going to create a Basic multitarget application. Configure the settings as shown below.</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_0-1736248723280.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/208948i4275236E66565FCC/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_0-1736248723280.png" alt="SailiRBendale_0-1736248723280.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_1-1736248731698.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/208949i353525996DE18188/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_1-1736248731698.png" alt="SailiRBendale_1-1736248731698.png" /></span><P>A new mta project will be generated (Workspace will be automatically created) with below structure.</P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_0-1736248848696.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/208956iE7F2F7E876A0F2E2/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_0-1736248848696.png" alt="SailiRBendale_0-1736248848696.png" /></span><P> </P><P>Note that the mta.yaml file will be initially empty as shown below.</P></DIV><P> </P><P> </P><P> </P><pre class="lia-code-sample language-yaml"><code>schema-version: "3.2"
ID: demomta
version: 0.0.1</code></pre><P> </P><P> </P><P> </P><P> </P><P><STRONG>Step 3: Adding approuter to the mta project. </STRONG></P><P>Use managed app router, which is maintained by SAP. For using managed approuter, you need to subscribe to portal/launchpad service. We have subscribed to workzone service in cockpit.</P><OL><LI>Right click on mta.yaml file and select 'Create MTA Module from Template'.</LI><LI>Follow the steps shown in below screenshots for approuter creation.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_2-1736249034456.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/208968iF3483DAEACF70A1D/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_2-1736249034456.png" alt="SailiRBendale_2-1736249034456.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_4-1736249068324.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/208970i550594E6430E59E9/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_4-1736249068324.png" alt="SailiRBendale_4-1736249068324.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_5-1736249082234.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/208971i43C0ED572CF46F46/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_5-1736249082234.png" alt="SailiRBendale_5-1736249082234.png" /></span></P><P>Note: mta.yaml file will be automatically updated as shown below.</P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-yaml"><code>_schema-version: "3.2"
ID: demomta
version: 0.0.1
modules:
- name: demomta-destination-content
type: com.sap.application.content
requires:
- name: demomta-destination-service
parameters:
content-target: true
- name: demomta_html_repo_host
parameters:
service-key:
name: demomta_html_repo_host-key
- name: uaa_demomta
parameters:
service-key:
name: uaa_demomta-key
parameters:
content:
instance:
destinations:
- Name: demomtaapprouter_demomta_html_repo_host
ServiceInstanceName: demomta-html5-app-host-service
ServiceKeyName: demomta_html_repo_host-key
sap.cloud.service: demomtaapprouter
- Authentication: OAuth2UserTokenExchange
Name: demomtaapprouter_uaa_demomta
ServiceInstanceName: demomta-xsuaa-service
ServiceKeyName: uaa_demomta-key
sap.cloud.service: demomtaapprouter
existing_destinations_policy: ignore
build-parameters:
no-source: true
resources:
- name: demomta-destination-service
type: org.cloudfoundry.managed-service
parameters:
config:
HTML5Runtime_enabled: true
init_data:
instance:
destinations:
- Authentication: NoAuthentication
Name: ui5
ProxyType: Internet
Type: HTTP
URL: https://ui5.sap.com
existing_destinations_policy: update
version: 1.0.0
service: destination
service-name: demomta-destination-service
service-plan: lite
- name: demomta_html_repo_host
type: org.cloudfoundry.managed-service
parameters:
service: html5-apps-repo
service-name: demomta-html5-app-host-service
service-plan: app-host
- name: uaa_demomta
type: org.cloudfoundry.managed-service
parameters:
path: ./xs-security.json
service: xsuaa
service-name: demomta-xsuaa-service
service-plan: application
parameters:
deploy_mode: html5-repo
enable-parallel-deployments: true</code></pre><P> </P><P> </P><P> </P><P><STRONG>Step 4: Create a UI module in the mta project.</STRONG></P><OL><LI>Right click on mta.yaml file and select 'Create MTA Module from Template'.</LI><LI>Follow the steps shown in below screenshots for UI module creation.</LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_0-1736337229395.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209636i2B58279C7EEE698A/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_0-1736337229395.png" alt="SailiRBendale_0-1736337229395.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_1-1736337240328.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209637iF950A341FFCED553/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_1-1736337240328.png" alt="SailiRBendale_1-1736337240328.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_2-1736337252378.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209638iD5D997D63D2B0C25/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_2-1736337252378.png" alt="SailiRBendale_2-1736337252378.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_3-1736337267792.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209639i5459F337E3EF5CC3/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_3-1736337267792.png" alt="SailiRBendale_3-1736337267792.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_4-1736337274412.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209640i74FA031FB27D2386/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_4-1736337274412.png" alt="SailiRBendale_4-1736337274412.png" /></span></P><DIV class=""> </DIV><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_5-1736337284344.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209642i719548C29C51F8DE/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_5-1736337284344.png" alt="SailiRBendale_5-1736337284344.png" /></span></P><P>Note: Project folder path should be the path of the MTA project created earlier and select the option to add deployment configuration to the project.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_6-1736337349432.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209643i861B5D417152F350/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_6-1736337349432.png" alt="SailiRBendale_6-1736337349432.png" /></span></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_7-1736337356222.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209644iB084BA22FA8E82C7/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_7-1736337356222.png" alt="SailiRBendale_7-1736337356222.png" /></span></P><P>Note: Mta.yaml file will be updated automatically to include newly added UI module in module section as highlighted below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_0-1736749828890.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/211060iCBB14B552A06798B/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_0-1736749828890.png" alt="SailiRBendale_0-1736749828890.png" /></span></P><P> </P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-yaml"><code>_schema-version: "3.2"
ID: demomta
version: 0.0.1
modules:
- name: demomta-destination-content
type: com.sap.application.content
requires:
- name: demomta-destination-service
parameters:
content-target: true
- name: demomta_html_repo_host
parameters:
service-key:
name: demomta_html_repo_host-key
- name: uaa_demomta
parameters:
service-key:
name: uaa_demomta-key
parameters:
content:
instance:
destinations:
- Name: demomtaapprouter_demomta_html_repo_host
ServiceInstanceName: demomta-html5-app-host-service
ServiceKeyName: demomta_html_repo_host-key
sap.cloud.service: demomtaapprouter
- Authentication: OAuth2UserTokenExchange
Name: demomtaapprouter_uaa_demomta
ServiceInstanceName: demomta-xsuaa-service
ServiceKeyName: uaa_demomta-key
sap.cloud.service: demomtaapprouter
existing_destinations_policy: ignore
build-parameters:
no-source: true
- name: demomta-app-content
type: com.sap.application.content
path: .
requires:
- name: demomta_html_repo_host
parameters:
content-target: true
build-parameters:
build-result: resources
requires:
- artifacts:
- nwui.zip
name: nwui
target-path: resources/
- name: nwui
type: html5
path: nwui
build-parameters:
build-result: dist
builder: custom
commands:
- npm install
- npm run build:cf
supported-platforms: []
resources:
- name: demomta-destination-service
type: org.cloudfoundry.managed-service
parameters:
config:
HTML5Runtime_enabled: true
init_data:
instance:
destinations:
- Authentication: NoAuthentication
Name: ui5
ProxyType: Internet
Type: HTTP
URL: https://ui5.sap.com
existing_destinations_policy: update
version: 1.0.0
service: destination
service-name: demomta-destination-service
service-plan: lite
- name: demomta_html_repo_host
type: org.cloudfoundry.managed-service
parameters:
service: html5-apps-repo
service-name: demomta-html5-app-host-service
service-plan: app-host
- name: uaa_demomta
type: org.cloudfoundry.managed-service
parameters:
path: ./xs-security.json
service: xsuaa
service-name: demomta-xsuaa-service
service-plan: application
parameters:
deploy_mode: html5-repo
enable-parallel-deployments: true</code></pre><P> </P><P> </P><P> </P><P>Now, the UI module will be created automatically with below structure.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_0-1736749614123.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/211059iB6A25FC0163B232A/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_0-1736749614123.png" alt="SailiRBendale_0-1736749614123.png" /></span></P><P> </P><P><STRONG>Step 5: Update the xs-app.json</STRONG></P><P>Update the xs-app.json file in the UI module folder to add routes for northwind service.</P><P>i.e. URLs which have nwdest in them will be redirected from mentioned destination in cockpit.</P><P> </P><P> </P><P> </P><pre class="lia-code-sample language-json"><code>{
"welcomeFile": "/index.html",
"authenticationMethod": "route",
"routes": [
{
"source": "^/nwdest/(.*)$",
"target": "/$1",
"authenticationType": "none",
"destination": "northwind"
},
{
"source": "^/resources/(.*)$",
"target": "/resources/$1",
"authenticationType": "none",
"destination": "ui5"
},
{
"source": "^/test-resources/(.*)$",
"target": "/test-resources/$1",
"authenticationType": "none",
"destination": "ui5"
},
{
"source": "^(.*)$",
"target": "$1",
"service": "html5-apps-repo-rt",
"authenticationType": "xsuaa"
}
]
}</code></pre><P> </P><P> </P><P> </P><P><STRONG>Step 6: Calling the Northwind Service using AJAX call.</STRONG></P><P>Add the below code in View1 controller init to call the NW service using destination configured in xs-app.json</P><P> </P><pre class="lia-code-sample language-javascript"><code> var sURL = "nwdest/V3/Northwind/Northwind.svc/Customers?$format=json";
var data = jQuery.ajax({
method: "GET",
async: false,
url: sURL,
success: function (data) {
console.log("in success");
}
});</code></pre><P> </P><P><STRONG>Step 7: Creation of second UI Module.</STRONG></P><P>Repeat the Steps 4 to 6, to create another UI module which will call service using restful destination.</P><P>Below project structure will be created.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_2-1736337651827.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209650i85DD97CD0BD83C7B/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_2-1736337651827.png" alt="SailiRBendale_2-1736337651827.png" /></span></P><P>Note: Mta.yaml should be automatically updated to include both UI modules</P><P> </P><pre class="lia-code-sample language-yaml"><code>_schema-version: "3.2"
ID: demomta
version: 0.0.1
modules:
- name: demomta-destination-content
type: com.sap.application.content
requires:
- name: demomta-destination-service
parameters:
content-target: true
- name: demomta_html_repo_host
parameters:
service-key:
name: demomta_html_repo_host-key
- name: uaa_demomta
parameters:
service-key:
name: uaa_demomta-key
parameters:
content:
instance:
destinations:
- Name: demomtaapprouter_demomta_html_repo_host
ServiceInstanceName: demomta-html5-app-host-service
ServiceKeyName: demomta_html_repo_host-key
sap.cloud.service: demomtaapprouter
- Authentication: OAuth2UserTokenExchange
Name: demomtaapprouter_uaa_demomta
ServiceInstanceName: demomta-xsuaa-service
ServiceKeyName: uaa_demomta-key
sap.cloud.service: demomtaapprouter
existing_destinations_policy: ignore
build-parameters:
no-source: true
- name: demomta-app-content
type: com.sap.application.content
path: .
requires:
- name: demomta_html_repo_host
parameters:
content-target: true
build-parameters:
build-result: resources
requires:
- artifacts:
- nwui.zip
name: nwui
target-path: resources/
- artifacts:
- restfulapiui.zip
name: restfulapiui
target-path: resources/
- name: nwui
type: html5
path: nwui
build-parameters:
build-result: dist
builder: custom
commands:
- npm install
- npm run build:cf
supported-platforms: []
- name: restfulapiui
type: html5
path: restfulapiui
build-parameters:
build-result: dist
builder: custom
commands:
- npm install
- npm run build:cf
supported-platforms: []
resources:
- name: demomta-destination-service
type: org.cloudfoundry.managed-service
parameters:
config:
HTML5Runtime_enabled: true
init_data:
instance:
destinations:
- Authentication: NoAuthentication
Name: ui5
ProxyType: Internet
Type: HTTP
URL: https://ui5.sap.com
existing_destinations_policy: update
version: 1.0.0
service: destination
service-name: demomta-destination-service
service-plan: lite
- name: demomta_html_repo_host
type: org.cloudfoundry.managed-service
parameters:
service: html5-apps-repo
service-name: demomta-html5-app-host-service
service-plan: app-host
- name: uaa_demomta
type: org.cloudfoundry.managed-service
parameters:
path: ./xs-security.json
service: xsuaa
service-name: demomta-xsuaa-service
service-plan: application
parameters:
deploy_mode: html5-repo
enable-parallel-deployments: true</code></pre><P> </P><P>xs-app.json in second UI module will look like below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_1-1736749961079.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/211061i540CF1B20C4392FE/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_1-1736749961079.png" alt="SailiRBendale_1-1736749961079.png" /></span></P><P> </P><pre class="lia-code-sample language-json"><code>{
"welcomeFile": "/index.html",
"authenticationMethod": "route",
"routes": [
{
"source": "^/restfulapi/(.*)$",
"target": "/$1",
"authenticationType": "none",
"destination": "restful"
},
{
"source": "^/resources/(.*)$",
"target": "/resources/$1",
"authenticationType": "none",
"destination": "ui5"
},
{
"source": "^/test-resources/(.*)$",
"target": "/test-resources/$1",
"authenticationType": "none",
"destination": "ui5"
},
{
"source": "^(.*)$",
"target": "$1",
"service": "html5-apps-repo-rt",
"authenticationType": "xsuaa"
}
]
}</code></pre><P> </P><P>and below code should be added to the View 1 controller of second UI Module.</P><P> </P><pre class="lia-code-sample language-javascript"><code> var sURL = "restfulapi/objects/4";
var data = jQuery.ajax({
method: "GET",
async: false,
url: sURL,
success: function (data) {
console.log("in success");
}
});</code></pre><P> </P><P><STRONG>Step 8: Build and deploy the project to cloud foundry</STRONG></P><P>Right click on the mta.yaml file and select 'Build MTA Project' to start the project build.</P><P>Once the build is successfully completed, a new folder 'mta_archives' will be added to the MTA project as shown below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_6-1736337865657.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209656iEA448DA2BD006751/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_6-1736337865657.png" alt="SailiRBendale_6-1736337865657.png" /></span></P><P>The mta_archives folder will contain a .mtar file which will be used for deployment to cloud foundry.</P><P>Right click on the .mtar file and select deploy option.</P><P>Note that system may prompt you to enter your Cloud Foundry credentials. Kindly enter the credentials and select correct API Endpoint and Org Space.</P><P>Once, application is successfully deployed, You will be able to find those applications in the cockpit under HTML5 Applications tab.</P><P>When you click on the link, you should be able to check the service call in network tab as shown below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_7-1736338107854.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209659i55C963F3FEE0F63E/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_7-1736338107854.png" alt="SailiRBendale_7-1736338107854.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SailiRBendale_8-1736338114409.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/209660i106B0F8C14B9DC27/image-size/medium?v=v2&px=400" role="button" title="SailiRBendale_8-1736338114409.png" alt="SailiRBendale_8-1736338114409.png" /></span></P><P> </P><P>With this, we come to the end of this blog post. I hope this blog post proves to be a useful resource in the future.</P><DIV class=""> </DIV>2025-01-14T16:22:49.327000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/communicate-from-a-java-application-to-abap-via-websocket-rfc-using-jco/ba-p/13981498Communicate from a Java Application to ABAP via WebSocket RFC using JCo - Migration Guide2025-01-21T19:20:20.825000+01:00simon_luserhttps://community.sap.com/t5/user/viewprofilepage/user-id/771659<P><A href="https://community.sap.com/t5/technology-blogs-by-sap/websocket-rfc-rfc-for-the-internet/ba-p/13502531" target="_blank">WebSocket RFC</A> is available for a while now. Continue reading, if</P><OL><LI>you want to communicate from an external Java application to an ABAP-based system via this new protocol using the <A href="https://support.sap.com/en/product/connectors/jco.html" target="_blank" rel="noopener noreferrer">JCo library</A>.</LI><LI>you have an existing JCo setup using classic CPIC-based RFC and want to migrate.</LI></OL><H1 id="toc-hId-950224196">Adjusting the destination</H1><P>For specifying the destination, instead of providing properties for application server logon (<SPAN><EM>jco.client.ashost</EM>, <EM>jco.client.sysnr</EM>) or message server logon (<EM>jco.client.mshost</EM>, <EM>jco.client.msserv</EM>, <EM>jco.client.r3name</EM>), the f</SPAN>ollowing properties must be provided:</P><UL><LI><SPAN><STRONG>jco.client.wshost</STRONG>: the hostname of the target system</SPAN></LI><LI><SPAN><STRONG>jco.client.wsport</STRONG>: the port for HTTPS/WSS (WebSocket Secure) of the target system</SPAN></LI></UL><P><SPAN>Optionally, you can also specify</SPAN></P><UL><LI><SPAN><STRONG>jco.client.tls_client_certificate_logon</STRONG>: If set to 1 this property enables to logon at the backend via the X.509 client certificate that is used in the TLS handshake (mTLS). An associated user or mapping rule must be defined at the backend.</SPAN></LI></UL><H1 id="toc-hId-753710691">Extending the implementation</H1><P>WebSocket RFC is based on TLS, thus a PKI infrastructure is required to be setup. To achieve that, following methods from the JCo interface <EM>DestinationDataProvider</EM> must be implemented:</P><P> </P><pre class="lia-code-sample language-java"><code>SSLContext getSSLContext(String destinationName)</code></pre><P> </P><P>This method returns a <EM>javax.net.ssl.SSLContext</EM> instance to JCo, which is used to create the TLS session for a given destination. How such an instance is created is up to the application - we are going to describe a simple use case in which all keys and CAs are stored in a local p12 file (<EM>p12FilePath</EM>) and the password is read from a secured database.</P><P> </P><pre class="lia-code-sample language-java"><code>SSLContext loadSSLContextFromFile() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException {
File p12File = new File(p12FilePath);
try (InputStream p12FileStream = new BufferedInputStream(new FileInputStream(p12File))) {
KeyStore ks = KeyStore.getInstance("PKCS12");
char[] pwd = SecuredDatabaseConnection.readPassword();
ks.load(p12FileStream, pwd);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, pwd);
// delete the plain text password from the heap memory as soon as possible
Arrays.fill(pwd, (char) 0);
pwd = null;
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
return sslContext;
}</code></pre><P> </P><P>(Optionally) If <SPAN><STRONG>jco.client.tls_client_certificate_logon </STRONG>is used, the API below must be implemented additionally:</SPAN></P><P> </P><pre class="lia-code-sample language-java"><code>X509Certificate getClientCertificate(String destinationName)</code></pre><P> </P><P>This method must return the <EM>java.security.cert.X509Certificate</EM> instance of the client certificate used for logon. It must be the one provided in the <EM>SSLContext</EM>, which is used during the TLS handshake.</P><H1 id="toc-hId-557197186">Setting up Trust</H1><H2 id="toc-hId-489766400">Creating the p12 File</H2><P>Create a p12 file with a private key using a tool like <A href="https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html" target="_blank" rel="noopener nofollow noreferrer">keytool</A> or <A href="https://docs.openssl.org/1.1.1/man1/pkcs12/" target="_blank" rel="noopener nofollow noreferrer">OpenSSL</A>. Create a CSR and import the CA response. Furthermore, import the CA certificate from the ABAP system which has been exported (see next section).</P><H2 id="toc-hId-293252895">Configuring trust in ABAP</H2><P>Navigate to transaction STRUST and select "SSL-Server Standard". Select the own certificate and export it. For more information, see also <A href="https://help.sap.com/docs/SAP_NETWEAVER_750/e73bba71770e4c0ca5fb2a3c17e8e229/4923501ebf5a1902e10000000a42189c.html" target="_blank" rel="noopener noreferrer">here</A>. Also, import the CA certificate from the p12 file and add it to the certificate list, so that mutual trust can be established.</P><H1 id="toc-hId--32343329">Using WebSocket RFC in BTP</H1><P>If you use JCo in BTP in conjunction with the Destination Service and you want to use WebSocket RFC to call publicly exposed endpoints, you can skip the above "Extending the implementation" part. This integration is already implemented by SAP in the supported environments. You can follow the steps in the <SPAN><A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/cloud-configure-rfc-destination" target="_blank" rel="noopener noreferrer">BTP Connectivity Service documentation</A></SPAN> on how to configure the Destination Service accordingly.</P>2025-01-21T19:20:20.825000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/new-destinations-ui-available-now-in-beta-version/ba-p/14004542New Destinations UI available now in BETA version2025-02-03T08:53:17.016000+01:00Yoganandahttps://community.sap.com/t5/user/viewprofilepage/user-id/75<H3 id="toc-hId-1830932961"><EM>A new Destinations UI for managing destination configuration objects is now available as a BETA version in the SAP BTP cockpit, side-by-side with the current UI. It is not yet at feature parity with the current UI, but feel free to try it out and send us your feedback.</EM><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2025-02-03_08-48-30.png" style="width: 724px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/220952i3543AB1F19207409/image-size/large?v=v2&px=999" role="button" title="2025-02-03_08-48-30.png" alt="2025-02-03_08-48-30.png" /></span><BR /><BR />Old Destination UI<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2025-02-02_22-13-08.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/220950iB803421B182A82BB/image-size/large?v=v2&px=999" role="button" title="2025-02-02_22-13-08.png" alt="2025-02-02_22-13-08.png" /></span></H3><H4 id="toc-hId-1763502175">Getting Started with the New Destinations UI</H4><P>To start using the new Destinations UI, follow these steps:</P><OL><LI><STRONG>Access the SAP BTP Cockpit</STRONG>: Log in to your SAP BTP account and navigate to the cockpit.</LI><LI><STRONG>Navigate to Destinations</STRONG>: In the cockpit, go to the Connectivity section and select Destinations.</LI><LI><STRONG>Explore the New UI</STRONG>: you can access to the BETA version, you will see the new interface. Take some time to explore the different features and options available.</LI><LI><STRONG>Create a New Destination</STRONG>: Click on the "Create Destination" button and fill in the required details, such as the destination name, URL, and authentication method.</LI><LI><STRONG>Save and Test</STRONG>: Save your new destination and test the connection to ensure everything is configured correctly</LI></OL><H3 id="toc-hId-1437905951"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2025-02-02_22-01-22.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/220948i30EE71E4BCD893B8/image-size/large?v=v2&px=999" role="button" title="2025-02-02_22-01-22.png" alt="2025-02-02_22-01-22.png" /></span><BR /><BR />Check Connection<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2025-02-02_22-06-05.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/220951iD71B3D5089ED5FB0/image-size/large?v=v2&px=999" role="button" title="2025-02-02_22-06-05.png" alt="2025-02-02_22-06-05.png" /></span><BR /><BR />Export Destination in (JSON, YAML & Properties)<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2025-02-02_22-04-34.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/220949i7C3BD44FCEB8D71B/image-size/large?v=v2&px=999" role="button" title="2025-02-02_22-04-34.png" alt="2025-02-02_22-04-34.png" /></span></H3><H4 id="toc-hId-1370475165">Benefits of the New Destinations UI</H4><P>The new Destinations UI offers several benefits for SAP BTP users:</P><UL><LI><STRONG>Efficiency</STRONG>: The streamlined workflow and enhanced configuration options save time and reduce complexity.</LI><LI><STRONG>Usability</STRONG>: The intuitive interface makes it easier for users to manage their destinations, even if they are new to SAP BTP.</LI><LI><STRONG>Flexibility</STRONG>: The ability to configure advanced settings and custom headers provides greater flexibility in connecting to remote systems.</LI><LI><STRONG>Visibility</STRONG>: Improved visibility into destination details helps users quickly identify and address any issues, ensuring smooth operation of their applications</LI></UL><H4 id="toc-hId-1173961660">Conclusion</H4><P>The new Destinations UI in the SAP BTP cockpit is a significant step forward in simplifying the management of destination configuration objects. As a BETA version, it offers a glimpse into the future of SAP BTP, where usability and efficiency are at the forefront. If you have access to the BETA version, be sure to explore the new features and provide feedback to help shape the final release.</P>2025-02-03T08:53:17.016000+01:00https://community.sap.com/t5/technology-blog-posts-by-sap/sap-cloud-connector-2-18-is-out/ba-p/14049553SAP Cloud Connector 2.18 is out!2025-03-19T23:42:44.566000+01:00MarcoErtelhttps://community.sap.com/t5/user/viewprofilepage/user-id/6305<P class="lia-align-justify" style="text-align : justify;"><SPAN>We’re excited to announce the availability of <A href="https://tools.hana.ondemand.com/#cloud" target="_self" rel="nofollow noopener noreferrer">SAP Cloud Connector version 2.18</A>. Building on previous iterations, this latest version offers several technical enhancements and solutions aimed at streamlining operations. Here are the key updates:</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>This release introduces support for Windows Server 2025. If you're preparing to upgrade your infrastructure, now’s the time to explore this compatibility. Note that some older OS versions will no longer be supported, so check the <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/prerequisites#loioe23f776e4d594fdbaeeb1196d47bbcc0__matrix" target="_blank" rel="noopener noreferrer">Product Availability Matrix</A> for precise details.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Certificates are crucial for maintaining secure connections, but they come with expiration dates. As frequently requested by our users, the new version supports automatic renewal for subaccounts, minimizing the risk of downtime due to forgotten refreshes.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarcoErtel_0-1742380121008.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/239546i71853F2F0D895521/image-size/medium?v=v2&px=400" role="button" title="MarcoErtel_0-1742380121008.png" alt="MarcoErtel_0-1742380121008.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Don’t forget to enable Certificate refresh in the BTP Cockpit. This capability isn't available in all cloud regions immediately; it will be rolled out in phases across different regions. Once it becomes available in your region, the toggle button in the BTP Cockpit will be visible.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>The administration UI defaults to Morning Horizon theme. However, you can also choose from other Horizon options, including Evening Horizon and Black/White High Contrast variants.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarcoErtel_1-1742380121011.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/239549i104C528706EDF172/image-size/medium?v=v2&px=400" role="button" title="MarcoErtel_1-1742380121011.png" alt="MarcoErtel_1-1742380121011.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Navigate to Configuration > User Interface to set your preferred theme.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Version 2.18 introduces centralized management of E-mail and LDAP server trust stores directly within the Cloud Connector, bypassing the traditional JDK trust store. This setup allows finer control over securing backend communications with trusted certificates.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>A new Troubleshooting section proactively diagnoses problems within the Cloud Connector.</SPAN></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarcoErtel_2-1742380121014.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/239555i265BCC01F26748D2/image-size/medium?v=v2&px=400" role="button" title="MarcoErtel_2-1742380121014.png" alt="MarcoErtel_2-1742380121014.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><SPAN> You’ll find detailed reports on issues, especially those affecting data tunnels, along with root cause analyses and potential fixes. The framework categorizes and tracks recurring issues, providing insights into their recurrence patterns over time.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>The cross-subaccount performance monitor aggregates metrics from all subaccounts related to cloud-to-on-premises traffic.</SPAN> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MarcoErtel_3-1742380362462.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/239557i08AB526E4C1816EE/image-size/medium?v=v2&px=400" role="button" title="MarcoErtel_3-1742380362462.png" alt="MarcoErtel_3-1742380362462.png" /></span></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>This consolidation aids in a more comprehensive analysis, helping you optimize resource allocation and network configurations efficiently.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Configure a fadeout time for service channels in HA setups to ensure smoother transitions when roles change intentionally between master and shadow instances. Known as the Service Channel Termination Grace Period, this new feature minimizes service disruptions by maintaining active channels during switches.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Certificate-based authentication now has a fallback mechanism to revert to user/password authentication if necessary. This added flexibility in logon processes ensures continual access, even when certificate-related issues arise.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Overall, SAP Cloud Connector 2.18 delivers enhancements focused on facilitating better security management, improving performance insights, and increasing reliability in high-stakes environments. Upgrade today to leverage these new features. For all technical details, see our comprehensive <A href="https://help.sap.com/whats-new/cf0cb2cb149647329b5d02aa96303f56?Component=Connectivity&locale=en-US&version=Cloud&Valid_as_Of=2025-03-06:2025-03-06" target="_blank" rel="noopener noreferrer">release notes</A>.</SPAN></P><P class="lia-align-justify" style="text-align : justify;"><SPAN>Happy connecting!</SPAN></P><P class="lia-align-justify" style="text-align : justify;"> </P>2025-03-19T23:42:44.566000+01:00https://community.sap.com/t5/technology-blog-posts-by-members/solving-the-serviceinstancename-dilemma-token-forwarding-destinations-on/ba-p/14119749Solving the ServiceInstanceName Dilemma: Token-Forwarding Destinations on SAP BTP with init_data2025-06-05T10:59:00.926000+02:00mlu2https://community.sap.com/t5/user/viewprofilepage/user-id/1379<H1 id="toc-hId-1602471079">Solving the ServiceInstanceName Dilemma: Token-Forwarding Destinations on SAP BTP with init_data</H1><P>When building multi-application landscapes on SAP BTP, configuring destinations correctly is crucial for seamless service integration. A common pattern is to forward an existing authentication token from an incoming request to a backend service secured by the same identity provider. The expectation is to avoid explicitly configuring authentication credentials or service bindings in the destination—just forward the token and go.</P><H2 id="toc-hId-1535040293">The Goal</H2><P>We wanted to create subaccount-level destinations using the Generic Application Content Deployment (GACD) module in our MTA. These destinations should:</P><UL><LI>Forward the authorization token from the request (forwardAuthToken: true).</LI><LI>Avoid the need for service bindings or token service configurations.</LI><LI>Be configured with NoAuthentication, since the actual token is already included in the request.</LI></UL><H2 id="toc-hId-1338526788">The Problem: Our Initial Approach with GACD</H2><P>Based on SAP documentation, we structured our mta.yaml like this:</P><PRE>modules:
- name: destination-content
type: com.sap.application.content
requires:
- name: destination-service
parameters:
content-target: true
- name: foo-api
- name: bar-api
parameters:
content:
subaccount:
destinations:
- Name: foo-api
URL: ~{foo-api/url}
forwardAuthToken: true
- Name: bar-api
URL: ~{bar-api/url}
forwardAuthToken: true
resources:
- name: destination-service
type: org.cloudfoundry.managed-service
parameters:
service: destination
service-plan: lite</PRE><P>The expectation was straightforward: deploy this MTA, and the foo-api and bar-api destinations would be created, correctly forwarding the authorization token.</P><H2 id="toc-hId-1142013283">The Unexpected Outcome: Missing destination property [ServiceInstanceName]</H2><P>However, upon deployment, we were met with the following error:</P><PRE>[ERROR] Missing destination property [ServiceInstanceName] in destination foo-api</PRE><P>This error was perplexing. Why would ServiceInstanceName be required for a destination designed to <EM>forward</EM> an existing token, rather than obtain one from a service instance (like an XSUAA or IAS service)? This seemed to contradict the very purpose of forwardAuthToken: true in this context.</P><H2 id="toc-hId-945499778">Clarification from SAP Support</H2><P>After seeking clarification, insights from SAP Development Support shed light on the situation. Here are the key points:</P><UL><LI>The GACD destination scenario, as currently implemented, primarily supports creating destinations <STRONG>through a service instance</STRONG>.</LI><LI>This means that even with forwardAuthToken: true, the GACD content module expects a ServiceInstanceName property. This implies an implicit dependency on a service instance for destination configuration, even if not for token fetching in the runtime.</LI><LI>For creating "NoAuthentication" destinations that simply forward the authorization token and do not rely on the destination service to obtain one from a bound service instance, the <STRONG>init_data approach</STRONG> is the recommended method.</LI></UL><H2 id="toc-hId-748986273">The Recommended Solution: Using init_data</H2><P>The init_data configuration within the resources section of your mta.yaml allows for direct definition of destination properties, bypassing the GACD content module's specific requirements for ServiceInstanceName in this `forwardAuthToken` scenario.</P><P>Here are corrected examples demonstrating how to achieve this using init_data:</P><H3 id="toc-hId-681555487">Example 1: Creating my_destination_service-1</H3><PRE>_schema-version: 3.1.0
ID: destination-with-app-1
version: 4.0.0
modules:
- name: app-provides-url-1
type: staticfile
path: ./hello-world.zip
parameters:
memory: 64M
provides:
- name: srv-api-1
properties:
srv-url: ${default-url}
resources:
- name: my_destination_service
type: org.cloudfoundry.managed-service
requires:
- name: srv-api-1
parameters:
service-plan: lite
service: destination
config:
HTML5Runtime_enabled: true
init_data:
subaccount:
existing_destinations_policy: update
destinations:
- Authentication: NoAuthentication
HTML5.ForwardAuthToken: true
Name: my_destination_service-1
ProxyType: Internet
Type: HTTP
URL: ~{srv-api-1/srv-url}</PRE><H3 id="toc-hId-485041982">Example 2: Appending my_destination_service-2 (reusing the same destination service instance)</H3><PRE>_schema-version: 3.1.0
ID: destination-with-app-2
version: 4.0.0
modules:
- name: app-provides-url-2
type: staticfile
path: ./hello-world.zip
parameters:
memory: 64M
provides:
- name: srv-api-2
properties:
srv-url: ${default-url}
resources:
- name: my_destination_service
type: org.cloudfoundry.managed-service
requires:
- name: srv-api-2
parameters:
service-plan: lite
service: destination
config:
HTML5Runtime_enabled: true
init_data:
subaccount:
existing_destinations_policy: update
destinations:
- Authentication: NoAuthentication
HTML5.ForwardAuthToken: true
Name: my_destination_service-2 # Name must be different from existing destinations
ProxyType: Internet
Type: HTTP
URL: ~{srv-api-2/srv-url}</PRE><H3 id="toc-hId-288528477">Key Highlights for `init_data` Destinations:</H3><UL><LI><STRONG>Authentication: NoAuthentication:</STRONG> Explicitly states that the destination itself will not handle authentication.</LI><LI><STRONG>HTML5.ForwardAuthToken: true:</STRONG> This specific property (often used in the context of HTML5 applications and Approuter) instructs the runtime to forward the incoming authorization token.</LI><LI><STRONG>No ServiceInstanceName Needed:</STRONG> When defined via `init_data` in this manner, you avoid the GACD-imposed requirement for this property.</LI><LI><STRONG>Direct Configuration:</STRONG> The destination is configured directly as part of the destination service instance's parameters, rather than through a separate `com.sap.application.content` module.</LI></UL><H2 id="toc-hId--37067747">Understanding Resource Reuse and Destination Merging</H2><P>A crucial point highlighted was how the my_destination_service resource behaves across multiple MTA deployments. When a resource with the same name and type (org.cloudfoundry.managed-service) is defined in several MTAs:</P><UL><LI>The system creates the service instance with the initialization data from the <STRONG>first deployment</STRONG>.</LI><LI><STRONG>Subsequent deployments</STRONG> of other MTAs defining the <EM>same resource</EM> will <STRONG>update</STRONG> this existing service instance. Their init_data will be incorporated, effectively <STRONG>merging</STRONG> the destinations.</LI><LI>Crucially, existing destinations (with different names) will <STRONG>not be deleted</STRONG>. New destinations are appended to the existing set. This "append" behavior is governed by the existing_destinations_policy: update setting within the init_data.</LI></UL><P>This means that if you deploy "destination-with-app-1" first, my_destination_service is created with my_destination_service-1. If you then deploy "destination-with-app-2" (using the same my_destination_service resource name), my_destination_service-2 will be added, resulting in both destinations existing within the same my_destination_service instance.</P><H2 id="toc-hId-113673105">Conclusion</H2><P>While the GACD content module offers a streamlined way to deploy destinations alongside application content, its current limitations prevent it from directly supporting simple token-forwarding destinations without a mandatory `ServiceInstanceName`. For now, leveraging the init_data configuration provides the flexibility to define these "NoAuthentication" destinations, ensuring that the authorization token is forwarded as intended without unnecessary dependencies.</P><P>Understanding the nuances of how service instances and their init_data are managed across MTA deployments is key to building robust and scalable solutions on SAP BTP. We hope to see future enhancements to the GACD module to more intuitively support this common and valuable pattern.</P>2025-06-05T10:59:00.926000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/exposing-sap-s4-onprem-data-to-external-system-odata-service-btp/ba-p/14151915Exposing SAP S4 Onprem data to external System || Odata Service || BTP || Destination-Connectivity2025-07-24T09:09:11.979000+02:00Ace_Dhttps://community.sap.com/t5/user/viewprofilepage/user-id/1501366<H2 id="toc-hId-1735011379"><STRONG>Prerequisites from BTP Side</STRONG></H2><OL><LI><STRONG>SAP BTP Account</STRONG><UL><LI>Access to SAP Business Technology Platform (BTP) with appropriate entitlements.</LI></UL></LI><LI><STRONG>SAP Cloud Connector Setup</STRONG><UL><LI>SAP Cloud Connector installed and configured to connect your on-premise S/4HANA system to SAP BTP.</LI><LI>Destination configured in BTP cockpit pointing to your on-premise system.</LI></UL></LI><LI><STRONG>Connectivity Service and Destination Service</STRONG><UL><LI>SAP BTP Connectivity service and destination service instance on the BTP account.</LI></UL></LI><LI><STRONG>Cloud Foundry Environment</STRONG><UL><LI>Cloud Foundry space set up in your BTP subaccount to deploy the application.</LI></UL></LI></OL><P><STRONG>Use Case:</STRONG></P><P>Lets take a simple use case for creating a RAP service on S4, which is a wrapper API call on the reprocess IDOC function module.</P><P>For this we will create a RAP service on the S4 box, than activate the service with the <STRONG>/IWFND/MAINT_SERVICE </STRONG>and activate the <STRONG>ICF Node as well.</STRONG></P><P>Note: In this blog we will not go through the steps of setting cloud connector and destination on the BTP account. We will assume that destination with cloud connector setup is already available on the BTP. </P><P><STRONG>Step 1: Create and activate the RAP service on the S4 Box.</STRONG></P><P> We will create a unmanaged rap scenario with custom entity and than we will create a service definition and top of service definition we will create service binding.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_0-1752479114889.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286063i6147300A58FD94EB/image-size/medium?v=v2&px=400" role="button" title="Ace_D_0-1752479114889.png" alt="Ace_D_0-1752479114889.png" /></span></P><P>Lets create the class for the query implementation.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_1-1752479219667.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286066i8FE4DD17F2125A3B/image-size/medium?v=v2&px=400" role="button" title="Ace_D_1-1752479219667.png" alt="Ace_D_1-1752479219667.png" /></span></P><DIV class=""> </DIV><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_3-1752479284513.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286068i7DF33D859E64B0B5/image-size/medium?v=v2&px=400" role="button" title="Ace_D_3-1752479284513.png" alt="Ace_D_3-1752479284513.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_4-1752479314425.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286069i1ADC607EAFF20853/image-size/medium?v=v2&px=400" role="button" title="Ace_D_4-1752479314425.png" alt="Ace_D_4-1752479314425.png" /></span></P><P>We are calling the FM to reprocess the idoc and checking the relevant table to get the latest reprocessed idoc status for the same.</P><P>Now we will create a service definition and service binding for the custom entity created.</P><P>Service Definition</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_8-1752479854976.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286073i72B0728E2CDB8D9C/image-size/medium?v=v2&px=400" role="button" title="Ace_D_8-1752479854976.png" alt="Ace_D_8-1752479854976.png" /></span></P><P>And overall project will look something like this.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_5-1752479511558.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286070iB8D8CB8704C75416/image-size/medium?v=v2&px=400" role="button" title="Ace_D_5-1752479511558.png" alt="Ace_D_5-1752479511558.png" /></span></P><P>Here i have created two types of service bindings v2 and v4 but we will be using only v2 for this.</P><P>So overall we created below 4 artifacts.</P><P>1. Custom entity</P><P>2. Class</P><P>3. Service definition</P><P>4. Service binding</P><P>Now to test the service we will publish the service first and than call the generated url</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_7-1752479816432.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286072iDC562CE467DBAAA5/image-size/medium?v=v2&px=400" role="button" title="Ace_D_7-1752479816432.png" alt="Ace_D_7-1752479816432.png" /></span></P><P>if you see the image, i have published the service and after publish we also got the custom entity that we have created, click on the <STRONG>service url</STRONG> and it will open in browser asking for authentication of S4 user id and password.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_9-1752480025822.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286074iD29880ABB4A5E44A/image-size/medium?v=v2&px=400" role="button" title="Ace_D_9-1752480025822.png" alt="Ace_D_9-1752480025822.png" /></span></P><P>Once the authentication is successful you should be able to see this.</P><P>Now lets open the SAP GUI so that i can show you the ICF node activation, which is generally taken care by basis team.</P><P>Open the Tcode: <STRONG>/IWFND/MAINT_SERVICE</STRONG></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_10-1752480290098.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286075i2C11D72626448B10/image-size/medium?v=v2&px=400" role="button" title="Ace_D_10-1752480290098.png" alt="Ace_D_10-1752480290098.png" /></span></P><P>Here you can find your activated service binding and make sure all components of the service looks as it is in the image.</P><P><STRONG>Assuming cloud connector and destination is setup on BTP.</STRONG></P><P>With this we completed the S4 box setup, now its ready to communicate with other external systems.</P><P><STRONG>Step 2: Creating the Destination service and Connectivity service on the BTP Account.</STRONG></P><P>Login in to BTP account and lets create 2 service instances with service keys.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_11-1752483153170.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286097iDCC3A3321CE1ECB0/image-size/medium?v=v2&px=400" role="button" title="Ace_D_11-1752483153170.png" alt="Ace_D_11-1752483153170.png" /></span></P><P>1. <STRONG>Destination service</STRONG>, this will help us to get the destination details, Destination service gets all the registered destinations on the BTP, from which we can filter out the destination that is up for our S4 onprem box.</P><P>Destination service will give us all the relevant things like user id passwd, location and etc. for that destination.</P><P>Service key for the destination service</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_12-1752483270245.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286098iBE180D64FD0F615E/image-size/medium?v=v2&px=400" role="button" title="Ace_D_12-1752483270245.png" alt="Ace_D_12-1752483270245.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_13-1752483330309.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286099i127A1F287FB75995/image-size/medium?v=v2&px=400" role="button" title="Ace_D_13-1752483330309.png" alt="Ace_D_13-1752483330309.png" /></span></P><P>2. <STRONG>Connectivity Service, </STRONG>Since we are trying to get the data out of onprem system we will have to use connectivity service from btp, which will provide us proxies, this proxies will be use to call the onprem odata url.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_14-1752483491742.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286106i3806395799EEF5CB/image-size/medium?v=v2&px=400" role="button" title="Ace_D_14-1752483491742.png" alt="Ace_D_14-1752483491742.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_15-1752483598535.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286107iCD11D07C5A492C3E/image-size/medium?v=v2&px=400" role="button" title="Ace_D_15-1752483598535.png" alt="Ace_D_15-1752483598535.png" /></span></P><P>It is important to paste here the service keys for better understanding since we will be using many things from the service key into our application</P><P><STRONG>Step 3: Lets create a python application to call the onprem service.</STRONG></P><P><STRONG>Important things to consider here.</STRONG></P><P><STRONG>By using destination and connectivity service we cannot test the application on local system, we will have to deploy our app on CF to test the same.</STRONG></P><P>We will use the flask requests and certain other libraries for the python programming</P><P>file: .env file to store all the secrets this secrets are from the service keys only.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_2-1752492372749.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286202iF6300349E7896528/image-size/medium?v=v2&px=400" role="button" title="Ace_D_2-1752492372749.png" alt="Ace_D_2-1752492372749.png" /></span></P><P> </P><P>File: Requirements.txt</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_0-1752492015085.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286200i27F53BD3C09B09AE/image-size/medium?v=v2&px=400" role="button" title="Ace_D_0-1752492015085.png" alt="Ace_D_0-1752492015085.png" /></span></P><P>File: Runtime.txt</P><P>python-3.11.*</P><P>file: manifest.yaml</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_1-1752492157202.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286201iA56CB734CFA3967C/image-size/medium?v=v2&px=400" role="button" title="Ace_D_1-1752492157202.png" alt="Ace_D_1-1752492157202.png" /></span></P><P>file:idocapis.py (should be same as mentioned in Manifest.yml file</P><P>Load all the required libraries.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_3-1752492555784.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286203iEB454EAAAAA7E66C/image-size/medium?v=v2&px=400" role="button" title="Ace_D_3-1752492555784.png" alt="Ace_D_3-1752492555784.png" /></span></P><P>define the function to get the token</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_4-1752493129840.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286204i152BA582C8BA1F8B/image-size/medium?v=v2&px=400" role="button" title="Ace_D_4-1752493129840.png" alt="Ace_D_4-1752493129840.png" /></span></P><P>Define function to get the list of all destinations on the BTP</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_5-1752493241781.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286205iA640B84C01B00E5E/image-size/medium?v=v2&px=400" role="button" title="Ace_D_5-1752493241781.png" alt="Ace_D_5-1752493241781.png" /></span></P><P>Define the function to construct the URL for the odata call</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_6-1752493319173.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286206i83806D03EC8AE6C7/image-size/medium?v=v2&px=400" role="button" title="Ace_D_6-1752493319173.png" alt="Ace_D_6-1752493319173.png" /></span></P><P>Define function to get token for the connectivity service</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_7-1752493411094.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286213i4C439E0B0047EB4E/image-size/medium?v=v2&px=400" role="button" title="Ace_D_7-1752493411094.png" alt="Ace_D_7-1752493411094.png" /></span></P><P>Define function to call the odata service with connectivity things</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_8-1752493551879.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286242iDE3AED9EE0D95C35/image-size/medium?v=v2&px=400" role="button" title="Ace_D_8-1752493551879.png" alt="Ace_D_8-1752493551879.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_9-1752493573946.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286243i670226B5E2674B07/image-size/medium?v=v2&px=400" role="button" title="Ace_D_9-1752493573946.png" alt="Ace_D_9-1752493573946.png" /></span></P><P>Now lets define the final route in flask to call this service</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_13-1752494450583.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286281i0C7C7F657EECF5CA/image-size/medium?v=v2&px=400" role="button" title="Ace_D_13-1752494450583.png" alt="Ace_D_13-1752494450583.png" /></span></P><P>One thing to note here the <STRONG>RESOURCE variable will depend on the destination url of the onprem that is setup on BTP.</STRONG></P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_11-1752494105816.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286279i7A1D0EA83E29C50A/image-size/medium?v=v2&px=400" role="button" title="Ace_D_11-1752494105816.png" alt="Ace_D_11-1752494105816.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_12-1752494133009.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286280iBAC4EB399CB3AEFD/image-size/medium?v=v2&px=400" role="button" title="Ace_D_12-1752494133009.png" alt="Ace_D_12-1752494133009.png" /></span></P><P><STRONG>STEP 4: Deployment</STRONG></P><P>Lets deploy the app on the CF by pushing the app to the cloud foundry from the BAS</P><P>Use command <STRONG>cf push</STRONG> after successful authentication for your cloud foundry space.</P><P>After the deployment on the cloud we can get the url that is generated on the cloud.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_14-1752495094785.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286283iF188D4ACAB2AC66A/image-size/medium?v=v2&px=400" role="button" title="Ace_D_14-1752495094785.png" alt="Ace_D_14-1752495094785.png" /></span></P><P><STRONG>Testing the application:</STRONG></P><P>Lets create a small python program to call this API in local now to test it.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ace_D_15-1752495325813.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/286284iA1C1678704489B7A/image-size/medium?v=v2&px=400" role="button" title="Ace_D_15-1752495325813.png" alt="Ace_D_15-1752495325813.png" /></span></P><P>You should get response coming from your S4 onPrem system.</P><P>Thanks for staying till the end!!!<span class="lia-unicode-emoji" title=":smiling_face_with_smiling_eyes:">😊</span></P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P><P> </P>2025-07-24T09:09:11.979000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-iii-successfactors/ba-p/14233747Identity and Access Management with Microsoft Entra, Part III: SuccessFactors and Role Provisioning2025-10-20T10:05:47.788000+02:00MartinRaepplehttps://community.sap.com/t5/user/viewprofilepage/user-id/171519<P><A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_blank">Part II</A> of this blog series took a technical deep-dive into a hybrid scenario for managing identities and their access across SAP Business Technology Platform (BTP) and S/4HANA on-premise. Part III enhances the scenario by introducing SAP SuccessFactors (SF) as the source for employee and user data, and leverages the new capabilities in Entra for SCIM-based provisioning to SAP Cloud Identity Service (CIS) supporting <EM>groups</EM> to streamline end-to-end role assignments in the connected SAP ABAP backend.</P><H2 id="toc-hId-1761851243">Scenario Overview</H2><P>Part III introduces substantial changes and enhancements to the scenario in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A>:</P><UL><LI>Microsoft Entra and Active Directory (AD) were the primary and authoritative systems (aka "source of authority", SOA) for identity data in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A>. For many organizations, however, the trusted SOA for identities is a <A href="https://www.sap.com/products/hcm/employee-central-hris/what-is-hris.html" target="_blank" rel="noopener noreferrer">Human Resource Information System (HRIS)</A> such as SAP SuccessFactors (SF), which will be added to the scenario in this part, and where new employees are now onboarded<SPAN>.</SPAN></LI><LI>Identity creation, updates, and deprovisioning are now driven by HR events (e.g., hiring, role changes, terminations) from SF. AD and Entra become downstream provisioning targets in this scenario. Because users require access to SAP from SAP GUI on their corporate AD domain-joined workstation using Kerberos/<A href="https://help.sap.com/doc/saphelp_nw75/7.5.5/en-US/e6/56f466e99a11d1a5b00000e835363f/frameset.htm" target="_blank" rel="noopener noreferrer">SNC</A>-based single sign-on (SSO, see <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A>), the solution architecture in this scenario integrates SF with the <A href="https://learn.microsoft.com/en-us/entra/identity/saas-apps/sap-successfactors-inbound-provisioning-tutorial" target="_blank" rel="noopener nofollow noreferrer">SAP SuccessFactors to Active Directory user provisioning connector</A> from the <A href="https://www.microsoft.com/en-us/security/business/identity-access/microsoft-entra-integrated-apps" target="_blank" rel="noopener nofollow noreferrer">Microsoft Entra App Gallery.</A> This p<SPAN>re-built, cloud-based solution </SPAN>supports <EM>inbound-</EM> or <EM><A href="https://learn.microsoft.com/en-us/entra/identity/app-provisioning/what-is-hr-driven-provisioning" target="_blank" rel="noopener nofollow noreferrer">HR-driven</A></EM> provisioning of new employees from SF to AD <SPAN>through Entra.</SPAN> New users provisioned to AD by this connector will be synchronized to Entra with the existing setup of t<SPAN>he </SPAN><A href="https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/concept-how-it-works" target="_blank" rel="noopener nofollow noreferrer">Microsoft Entra Cloud Sync Provisioning Agent</A><SPAN> from <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A> of this blog series that runs on the Domain Controller (DC) in our fictitious company BestRun's corporate network</SPAN>.</LI><LI><A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">Part II</A> focused on the automation of provisioning the user's identity data. The user's authorization in the SAP backend (we used role<SPAN> </SPAN><A href="https://help.sap.com/docs/ABAP_PLATFORM_NEW/c238d694b825421f940829321ffa326a/4ec2c02e6e391014adc9fffe4e204223.html?q=SAP_BC_ABAP_DEVELOPER_5&locale=en-US" target="_blank" rel="noopener noreferrer">SAP_BC_ABAP_DEVELOPER_5</A> <SPAN>as an example) </SPAN>was still managed manually by assigning the user to the equally named group "SAP_BC_ABAP_DEVELOPER_5" in the CIS tenant (see step 10.20 in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A>). Also the group in CIS had to be created manually in the previous part of the scenario (see steps 9.17-9.19). This approach may work for a few backend authorizations, but won't scale for a larger number of connected systems and applications with complex authorization models. A key objective in this scenario is to fully automate end-to-end provisioning and deprovisioning of the user's authorizations, which includes the synchronization of backend roles and their corresponding groups in CIS and Entra, as well as the memberships of users to these groups, that ultimately assigns them to the backend roles. The updated version of the <A href="https://learn.microsoft.com/en-us/entra/identity/saas-apps/sap-cloud-platform-identity-authentication-provisioning-tutorial" target="_blank" rel="noopener nofollow noreferrer">SAP CIS connector</A> from the <A href="https://www.microsoft.com/en-us/security/business/identity-access/microsoft-entra-integrated-apps" target="_blank" rel="noopener nofollow noreferrer">Microsoft Entra App Galley</A> now enables automated provisioning of <EM>groups</EM> and their <EM>entitlements</EM> as <EM>memberships</EM> from Entra to CIS. This new feature in the SCIM (System for Cross-domain Identity Management, IETF RFCs <A href="https://tools.ietf.org/html/rfc7642" target="_blank" rel="nofollow noopener noreferrer">7642</A>, <A href="https://tools.ietf.org/html/rfc7643" target="_blank" rel="nofollow noopener noreferrer">7643</A> and <A href="https://tools.ietf.org/html/rfc7644" target="_blank" rel="nofollow noopener noreferrer">7644</A>)-compliant outbound provisioning connector in Entra streamlines the end-to-end lifecycle management for authorizations in the scenario. By assigning the new user to a group representing the <A href="https://learning.sap.com/learning-journeys/exploring-the-authorization-concept-for-sap-s-4hana-and-sap-business-suite/creating-standard-roles" target="_blank" rel="noopener noreferrer">PFCG role</A> in the SAP ABAP system, this group and the user's membership are now also automatically provisioned to CIS, and from there to the backend system. Similar to <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A>, the group in Entra and CIS is mapped to the PFCG role by using the same name.</LI></UL><P>Figure 1 illustrates the SOA for the IAM entities in the scenario:</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 1" style="width: 282px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329689i917D242B40ECE381/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="figure1.png" alt="Figure 1" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 1</span></span></P><P> </P><P>Although SOA for identity data moves to SF, the connected SAP system remains the authority for the <EM>definition</EM> of the roles that can be assigned in the scenario. Managing the actual <EM>assignment</EM> of users to these roles through access packages and approval workflows remains the responsibility of Entra ID Governance. With no single SOA for users, groups and roles centralized at one place in the system landscape, figure 2 shows the updated and newly introduced system components based on the existing setup from <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A>, and illustrates the steps of the provisioning flow for a new onboarded employee requesting access to a role in the corporate SAP system:</P><P> </P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Figure 2" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329690iC40448471EB1C535/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="figure2.png" alt="Figure 2" /><span class="lia-inline-image-caption" onclick="event.preventDefault();">Figure 2</span></span></P><P> </P><P> </P><P> </P><OL><LI>CIS is responsible to integrate the connected SAP systems following this <A href="https://architecture.learning.sap.com/docs/ref-arch/20c6b29b1e/2" target="_blank" rel="noopener noreferrer">reference architecture</A>. It synchronizes the role from the backend (SAP_BC_EPM_DEMO in this scenario) with the <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/sap-application-server-abap" target="_blank" rel="noopener noreferrer">SAP Application Server ABAP connector configured as a Source System</A> in BestRun's CIS tenant Identity Provisioning Service (IPS) which results in creating a group with the same name in the tenant's local directory. Connectivity from CIS to the SAP system on-premises remains unchanged from <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A> and is established via the <A href="https://discovery-center.cloud.sap/serviceCatalog/connectivity-service?region=all" target="_blank" rel="noopener nofollow noreferrer">connectivity service in BTP</A> and the <A href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/cloud-connector" target="_blank" rel="noopener noreferrer">SAP Cloud Connector</A> deployed in the corporate network.</LI><LI>CIS also takes care for creating the group in Entra by provisioning it with the <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/target-microsoft-entra-id" target="_blank" rel="noopener noreferrer">Entra ID connector configured as a target system</A> in the CIS tenant. This connector uses the <A href="https://learn.microsoft.com/en-us/graph/api/resources/groups-overview?view=graph-rest-1.0&tabs=http" target="_blank" rel="noopener nofollow noreferrer">Microsoft Graph API</A> to manage groups in Entra.</LI><LI>The HR admin adds a new employee record in SF for the user in the sceanrio, Linda Larson. </LI><LI>The <A href="https://learn.microsoft.com/en-us/entra/identity/saas-apps/sap-successfactors-inbound-provisioning-tutorial" target="_blank" rel="noopener nofollow noreferrer">SAP SuccessFactors to Active Directory user provisioning connector</A> picks up the new employee record <SPAN>by calling the <A href="https://learn.microsoft.com/en-us/entra/identity/app-provisioning/sap-successfactors-integration-reference" target="_blank" rel="noopener nofollow noreferrer">SF Employee Central OData API endpoints</A> </SPAN>to query for new or updated data.</LI><LI>The connector then provisions a user account for the new employee Linda in BestRun's corporate AD via <A href="https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/concept-how-it-works" target="_blank" rel="noopener nofollow noreferrer">Entra Cloud Sync and the Entra Provisioning Agent</A> on the DC.</LI><LI>With Entra Cloud Sync configured in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A> to <A href="https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/how-to-configure" target="_blank" rel="noopener nofollow noreferrer">synchronize AD with the Entra</A> tenant, the new account in the corporate AD is also provisioned to BestRun's Entra ID tenant.</LI><LI>Linda starts a request for the <EM>SAP EPM</EM> access package with the <A href="https://docs.azure.cn/en-us/entra/id-governance/my-access-portal-overview" target="_blank" rel="noopener nofollow noreferrer">MyAccess portal</A>. For this initial login to Entra, Linda can use the <SPAN>self-service password reset (SSPR) feature in Entra to set her new Entra user account's password. With <A href="https://learn.microsoft.com/en-us/entra/identity/authentication/concept-sspr-writeback" target="_blank" rel="noopener nofollow noreferrer">password writeback enabled in Entra Cloud Sync</A> and SSPR to use password writeback, Linda's initial password reset or any future changes of her password are synchronized back to BestRun's on-premises AD as well. </SPAN><SPAN>By completing the request, Linda is assigned to the access package resources, and becomes a member in the SAP_BC_EPM_DEMO group in Entra. To keep things simple, the access package policy requires no approval steps in this scenario.</SPAN></LI><LI>The <A href="https://learn.microsoft.com/en-us/entra/identity/saas-apps/sap-cloud-platform-identity-authentication-provisioning-tutorial" target="_blank" rel="noopener nofollow noreferrer">SAP CIS connector enterprise app</A> is configured to perform all operations (create/update/delete) on new or existing user objects, but to skip creation on groups. Otherwise, Entra would try to create the same group again in CIS that has already been created in step 1, which would result in a naming conflict. Instead, it creates a new user account for Linda in CIS, but only updates her membership to the <SPAN>SAP_BC_EPM_DEMO group in </SPAN>BestRun's CIS tenant.<BR />In addition to the new support for groups in the new version of the SAP CIS connector, authentication to CIS no longer uses basic authentication that sends static credentials with every request. Instead, short‑lived tokens with scoped, limited privileges using the <A href="https://datatracker.ietf.org/doc/html/rfc6749#section-4.4" target="_blank" rel="noopener nofollow noreferrer">OAuth 2.0 client credentials grant flow</A> enhance security over basic authentication.</LI><LI>Provisioning to the SAP backend with the already existing <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/target-sap-application-server-abap" target="_blank" rel="noopener noreferrer">SAP Application Server ABAP connector configured as a Target System</A> in IPS starts by reading the new user and her group membership from the CIS tenant's local directory, and creating the new user in SAP as well as assigning this user to the corresponding <SPAN>SAP_BC_EPM_DEMO role.</SPAN></LI><LI>Finally, Linda can login to BestRun's corporate AD from her workstation, obtains a Kerberos token from the DC, and uses it to securely single sign-on to the backend from SAP GUI and the SAP Secure Login Client. This requires mapping of her user principal name (UPN) in AD to her SAP user, which has already been configured in the mappings of the SAP CIS connector in Entra (see step 6.18 in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A>) and the transformation of the SAP Application Server ABAP target system in IPS (see step 9.12 in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_self">part II</A>).</LI></OL><P>If you want to see the scenario in action, tune into <A href="https://eu01web.zoom.us/rec/share/GhPI3WX8f78T47EuMtsFrT3P5ADDEyyUuqj_vEGlMN3Dtvu6e_wpPrqYKnX7TPVt.T_4kNxoeY4L8rkut" target="_blank" rel="noopener nofollow noreferrer">the recording</A> from our latest online session (in german language) with the <A href="https://dsagnet.de/gremium/sap-iam-strategie-mit-microsoft" target="_blank" rel="noopener nofollow noreferrer">DSAG TG "SAP IAM Strategie mit Microsoft" </A> from October 7th, or check out <A href="https://www.youtube.com/watch?v=MKZb0b2tXIU&feature=youtu.be" target="_blank" rel="noopener nofollow noreferrer">episode 263</A> from <a href="https://community.sap.com/t5/user/viewprofilepage/user-id/3494">@Holger-Bruchelt</a> <A href="https://www.saponazurepodcast.de/" target="_blank" rel="noopener nofollow noreferrer">SAP on Azure video podcast</A>.</P><P><div class="video-embed-center video-embed"><iframe class="embedly-embed" src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FMKZb0b2tXIU%3Ffeature%3Doembed&display_name=YouTube&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DMKZb0b2tXIU&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FMKZb0b2tXIU%2Fhqdefault.jpg&type=text%2Fhtml&schema=youtube" width="200" height="112" scrolling="no" title="#263 - ToW SuccessFactors integration & Role provisioning (Martin Raepple) | SAP on Azure Video" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" allowfullscreen="true"></iframe></div></P><H2 id="toc-hId-883691727" id="toc-hId-1565337738"><SPAN>Prerequisites and lab setup</SPAN></H2><P><SPAN>You can continue to use all subscriptions, systems and tenants from your lab in <A href="https://community.sap.com/t5/technology-blogs-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_blank">part II</A>, because all prerequisites also apply for this scenario. In addition, make sure that you meet the following prerequisites to successfully implement the enhanced scope of this scenario:</SPAN></P><UL><LI><SPAN>Administrative access to an <STRONG>SF instance</STRONG> with permissions to setup provisioning credentials and onboard new employees.</SPAN></LI><LI><SPAN>An SCI tenant in a <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/connect-to-on-premise-systems-in-sap-cloud-identity-infrastructure" target="_blank" rel="noopener noreferrer">matching region</A> of your BTP subaccount for on-premise connectivity that has <A href="https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/target-microsoft-entra-id" target="_blank" rel="noopener noreferrer"><STRONG>Microsoft Entra ID</STRONG> as a target system</A> enabled.</SPAN></LI><LI><SPAN>An <A href="https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr" target="_blank" rel="noopener nofollow noreferrer">Entra ID tenant with self-service password reset (SSPR) enabled</A> and <A href="https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-cloud-sync-sspr-writeback" target="_blank" rel="noopener nofollow noreferrer">Entra Connect cloud sync configured for SSPR writeback</A> to the AD in the scenario.</SPAN></LI><LI><SPAN>Re-run steps 9.1 to 9.10 of <A href="https://community.sap.com/t5/technology-blogs-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_blank">part II</A></SPAN><SPAN> in your CIS tenatn with the updated file <A href="https://github.com/raepple/iam-with-entra/blob/0a73239a81c596811d0e704eb715045c2fdddde0/part3/LocalDirectory.json" target="_blank" rel="noopener nofollow noreferrer">LocalDirectory.json</A> for the LocalDirectory source system, and the updated file <A href="https://github.com/raepple/iam-with-entra/blob/0a73239a81c596811d0e704eb715045c2fdddde0/part3/SAPA4H_IPS.json" target="_blank" rel="noopener nofollow noreferrer">SAPA4H_IPS.json</A> for the SAPA4H target system. The updated files apply minor changes to the transformations of both systems based on <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/bc-p/14021715/highlight/true#M171937" target="_blank">valuable feedback in the comments to part II</A>. The customAttributes are no longer used to carry over the values for the SAP user name and SNC mapping from Entra to CIS. Instead, the extension attribute sapUserName is used, and construction of the SNC mapping has moved from Entra to the transformation of the SAPA4H target systems (lines 13 to 28).</SPAN></LI></UL><TABLE border="1" width="100%"><TBODY><TR><TD width="100%"><SPAN><STRONG>Note </STRONG><span class="lia-unicode-emoji" title=":loudspeaker:">📢</span><span class="lia-unicode-emoji" title=":loudspeaker:">📢</span><span class="lia-unicode-emoji" title=":loudspeaker:">📢</span></SPAN></TD></TR><TR><TD width="100%"><P><SPAN>This tutorial extends and updates the scenario </SPAN><SPAN>from <A href="https://community.sap.com/t5/technology-blogs-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_blank">part II</A>. Any components and their configurations that are not added or changed in this scenario, such as the SAP Cloud Connector or Active Directory, are not covered in this tutorial. If you arrived here and have not completed <A href="https://community.sap.com/t5/technology-blogs-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_blank">part II</A>, please do so first, and then come back again.</SPAN></P></TD></TR></TBODY></TABLE><P><SPAN>As before, supporting files for this tutorial can be found in the blog series <A href="https://github.com/raepple/iam-with-entra" target="_blank" rel="noopener nofollow noreferrer">GitHub repository</A>. Now l</SPAN>et's get started with setting up the provisioning of new employees from SAP SuccessFactors to Entra.</P><H2 id="toc-hId-1368824233">Create API User in SuccessFactors for provisioning to Entra</H2><P>Calling the SF OData APIs from both SF connector apps (Entra & AD) requires an API User in your SF instance who has the appropriate permissions to <A href="https://learn.microsoft.com/en-us/entra/identity/app-provisioning/sap-successfactors-attribute-reference" target="_blank" rel="noopener nofollow noreferrer">retrieve the required entities and their attributes</A>.</P><TABLE border="1"><TBODY><TR><TD width="46.2879px" height="30px"><STRONG>Step</STRONG></TD><TD width="350px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="46.2879px" height="375px">1.1</TD><TD width="350px" height="375px"><STRONG>Login</STRONG> to your SF instance as a system administrator who has access to the <EM>Admin Center</EM>.</TD><TD width="350px" height="375px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323059i1B59BBDBCDDD4A33/image-size/medium?v=v2&px=400" role="button" title="1-1.jpg" alt="1-1.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="110px">1.2</TD><TD width="350px" height="110px">Enter <EM>Import Employee Data</EM> in the <STRONG>search bar</STRONG> and select the action from the search results.</TD><TD width="350px" height="110px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323060i7964CEF9C7817A56/image-size/medium?v=v2&px=400" role="button" title="1-2.jpg" alt="1-2.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="199px">1.3</TD><TD width="350px" height="199px"><P>Select <EM>Basic Import</EM> from the <STRONG>entity</STRONG> drop-down list.</P><P>Click <STRONG>Browse...</STRONG></P></TD><TD width="350px" height="199px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323061iB05B9AC607ED2276/image-size/medium?v=v2&px=400" role="button" title="1-3.jpg" alt="1-3.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="140px">1.4</TD><TD width="350px" height="140px">Open the <A href="https://github.com/raepple/iam-with-entra/blob/39542db929093ab4a974db4b3bb37b763532762b/part3/entra_api_user_import.csv" target="_blank" rel="noopener nofollow noreferrer">CSV file</A> to import the API user from the <A href="https://github.com/raepple/iam-with-entra/tree/main/part3" target="_blank" rel="noopener nofollow noreferrer">GitHub repo</A>.</TD><TD width="350px" height="140px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323058i6D52F83BE01AD00E/image-size/medium?v=v2&px=400" role="button" title="1-4.jpg" alt="1-4.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="162px">1.5</TD><TD width="350px" height="162px">Click <STRONG>Validate Import File Data</STRONG>.</TD><TD width="350px" height="162px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323062i5B8E010A05CC894E/image-size/medium?v=v2&px=400" role="button" title="1-5.jpg" alt="1-5.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="199px">1.6</TD><TD width="350px" height="199px"><P>Check for the <STRONG>Validation Successful</STRONG> message.</P><P>Click <STRONG>Import</STRONG>.</P></TD><TD width="350px" height="199px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-6.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323064i1B97BE0FBD73B4E5/image-size/medium?v=v2&px=400" role="button" title="1-6.jpg" alt="1-6.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="79px">1.7</TD><TD width="350px" height="79px">Wait for the <STRONG>confirmation message</STRONG> that the file has been uploaded and is being processed.</TD><TD width="350px" height="79px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-7.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323063i849299EB0199276B/image-size/medium?v=v2&px=400" role="button" title="1-7.jpg" alt="1-7.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="67px">1.8</TD><TD width="350px" height="67px">Enter <STRONG>Manage Permission Roles</STRONG> in the search bar and select the action from the search results.</TD><TD width="350px" height="67px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-8.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323065iC50F0C2EBE2B30B9/image-size/medium?v=v2&px=400" role="button" title="1-8.jpg" alt="1-8.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="83px">1.9</TD><TD width="350px" height="83px">Click <STRONG>Create</STRONG>.</TD><TD width="350px" height="83px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-9.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323066i85790CC25D33DC75/image-size/medium?v=v2&px=400" role="button" title="1-9.jpg" alt="1-9.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="234px">1.10</TD><TD width="350px" height="234px"><P>Enter <EM>Entra Provisioning Role</EM> as the <STRONG>Name</STRONG> for the new Permission Role that will be assigned to the imported API user.</P><P>Keep the default value <EM>Employee</EM> for <STRONG>User Type</STRONG>, and click <STRONG>Next</STRONG>.</P></TD><TD width="350px" height="234px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-10.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323067i2E19DC6F9C23F8AC/image-size/medium?v=v2&px=400" role="button" title="1-10.jpg" alt="1-10.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="241px">1.11</TD><TD width="350px" height="241px"><P>On the Add Permissions step in the Create Role wizard, enter <EM>Manage Integration Tools</EM> in the <STRONG>search bar</STRONG> and click the lens icon.</P><P><STRONG>Activate</STRONG> the checkbox for <EM>Allow Admin to Access OData API throuch Basic Authentication</EM>.</P></TD><TD width="350px" height="241px"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="1-11.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323069i8E60C758B303334E/image-size/medium?v=v2&px=400" role="button" title="1-11.jpg" alt="1-11.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="217px">1.12</TD><TD width="350px" height="217px"><P>Enter <EM>Employee Central API</EM> in the <STRONG>search bar</STRONG> and click the lens icon.</P><P><STRONG>Activate</STRONG> the following checkboxes:</P><UL><LI>Employee Central Foundation OData API (read-only)</LI><LI>Employee Central HRIS OData API (read-only)</LI><LI>Employee Central Foundation OData API (editable)</LI><LI>Employee Central HRIS OData API (editable)</LI></UL></TD><TD width="350px" height="217px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-12.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323169i9E0F15E15CBFFC08/image-size/medium?v=v2&px=400" role="button" title="1-12.jpg" alt="1-12.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="315px">1.13</TD><TD width="350px" height="315px"><P>Enter <EM>Employee Data</EM> in the <STRONG>search bar</STRONG> and click the lens icon.</P><P>Scroll to the <STRONG>User Information</STRONG> section and <STRONG>activate</STRONG> the <STRONG>View</STRONG> checkbox for all attributes.</P></TD><TD width="350px" height="315px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-13.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323071iDECEDA2DBAFB8480/image-size/medium?v=v2&px=400" role="button" title="1-13.jpg" alt="1-13.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="402px">1.14</TD><TD width="350px" height="402px">Scroll down to the <STRONG>HR Information</STRONG> section and <STRONG>active</STRONG> the <STRONG>View</STRONG> checkbox for all attributes.</TD><TD width="350px" height="402px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-14.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323077i26DF741821B67369/image-size/medium?v=v2&px=400" role="button" title="1-14.jpg" alt="1-14.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="277px">1.15</TD><TD width="350px" height="277px"><P>Scroll down to the <STRONG>Employment Details</STRONG> section and <STRONG>activate</STRONG> the <STRONG>View</STRONG> checkbox for all attributes.</P><P>Click <STRONG>Next</STRONG>.</P></TD><TD width="350px" height="277px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-15.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323078i6EEC00AD606F0ACC/image-size/medium?v=v2&px=400" role="button" title="1-15.jpg" alt="1-15.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="284px">1.16</TD><TD width="350px" height="284px">Click <STRONG>Save</STRONG>.</TD><TD width="350px" height="284px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-16.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323079i195554F8B410E08C/image-size/medium?v=v2&px=400" role="button" title="1-16.jpg" alt="1-16.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="188px">1.17</TD><TD width="350px" height="188px">Click <STRONG>Not Now</STRONG>.</TD><TD width="350px" height="188px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-17.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323080i06829747256F7A39/image-size/medium?v=v2&px=400" role="button" title="1-17.jpg" alt="1-17.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="48px">1.18</TD><TD width="350px" height="48px">In the <STRONG>search bar</STRONG>, enter <EM>Manage Permission Groups</EM> and select the action from the search results.</TD><TD width="350px" height="48px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-18.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323081iF0404AAD332EA294/image-size/medium?v=v2&px=400" role="button" title="1-18.jpg" alt="1-18.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="114px">1.19</TD><TD width="350px" height="114px">Click <STRONG>Create New</STRONG>.</TD><TD width="350px" height="114px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-19.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323082i39E502F0AC2012DF/image-size/medium?v=v2&px=400" role="button" title="1-19.jpg" alt="1-19.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.20</TD><TD width="350px" height="30px"><P>Enter <EM>Entra Provisioning Group</EM> for the <STRONG>Group Name</STRONG> of the new permission group.</P><P>Add the imported API user to the new group by selecting <STRONG>User Type</STRONG> <EM>Employee</EM>.</P><P>Select <STRONG>User</STRONG> from the <STRONG>People Pool</STRONG> drop down list.</P><P>Select <EM>= (equal to)</EM> as the <STRONG>search operation</STRONG>, and enter <EM>Entra</EM> as the value. </P><P>Select the imported API user record <EM>entra entra provisioning</EM> from the value help.</P><P>Click <STRONG>Done</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-20.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323083iBA322FC45977BA2B/image-size/medium?v=v2&px=400" role="button" title="1-20.jpg" alt="1-20.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.21</TD><TD width="350px" height="30px">Click <STRONG>Done</STRONG>.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-21.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323084iD34A7779A1D22864/image-size/medium?v=v2&px=400" role="button" title="1-21.jpg" alt="1-21.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.22</TD><TD width="350px" height="30px">In the <STRONG>search bar</STRONG>, enter <EM>Manage Permission Roles </EM>and select the action from the search results.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-22.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323085i9E4D04F57C144FC2/image-size/medium?v=v2&px=400" role="button" title="1-22.jpg" alt="1-22.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.23</TD><TD width="350px" height="30px">From the list of permission roles, click on the <STRONG>Add Role Assignment</STRONG> action for the new <STRONG>Entra Permission Role</STRONG>.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-23.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323087iD936181505CD5BF0/image-size/medium?v=v2&px=400" role="button" title="1-23.jpg" alt="1-23.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.24</TD><TD width="350px" height="30px"><P>Keep the default values on the <STRONG>Basic information</STRONG> tab.</P><P>Click <STRONG>Next</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-24.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323088iE23F2CF4D41C8D1D/image-size/medium?v=v2&px=400" role="button" title="1-24.jpg" alt="1-24.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.25</TD><TD width="350px" height="30px"><P>Select the <STRONG>From groups</STRONG> option.</P><P>Click <STRONG>Select Groups</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-25.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323089i30E7B9BC40B1AD62/image-size/medium?v=v2&px=400" role="button" title="1-25.jpg" alt="1-25.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.26</TD><TD width="350px" height="30px"><P><STRONG>Activate</STRONG> the checkbox for the new<STRONG> Entra Provisioning Group</STRONG>.</P><P>Click <STRONG>Select</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-26.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323090i4D12FD48E1882E0C/image-size/medium?v=v2&px=400" role="button" title="1-26.jpg" alt="1-26.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.27</TD><TD width="350px" height="30px">Click <STRONG>Next</STRONG>.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-27.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323091i82ED31522003DA7D/image-size/medium?v=v2&px=400" role="button" title="1-27.jpg" alt="1-27.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.28</TD><TD width="350px" height="30px"><P>Keep the default values on the <STRONG>Define a Target Population</STRONG> step and click <STRONG>Next</STRONG>.</P><P>Keep the default values on the <STRONG>Define Data Blocking</STRONG> step and click <STRONG>Next</STRONG>.</P><P>On the <STRONG>Preview</STRONG> step, click <STRONG>Save</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-28.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323092iC9BBDF41415911E5/image-size/medium?v=v2&px=400" role="button" title="1-28.jpg" alt="1-28.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.29</TD><TD width="350px" height="30px">Enter <EM>Reset User Passwords</EM> in the <STRONG>search bar</STRONG> and select the action from the results list.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-29.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323093iDD8EF62B93BEB298/image-size/medium?v=v2&px=400" role="button" title="1-29.jpg" alt="1-29.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.30</TD><TD width="350px" height="30px"><P>In the <STRONG>Username</STRONG> field, enter <EM>entra_provisioning_user</EM>.</P><P>Select the imported API user <STRONG>entra_provisioning_user (entra entra provisioning)</STRONG> from the value help.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-30.jpg" style="width: 332px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323094i60A7CE0AFF45FB56/image-size/medium?v=v2&px=400" role="button" title="1-30.jpg" alt="1-30.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.31</TD><TD width="350px" height="30px"><P>Select the user in the result list.</P><P>Enter the same value for the password in the <STRONG>New Password</STRONG> and <STRONG>Confirm Password</STRONG> field.</P><P>Click <STRONG>Reset User Password</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-31.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323095i0713465BAAE3F153/image-size/medium?v=v2&px=400" role="button" title="1-31.jpg" alt="1-31.jpg" /></span></TD></TR><TR><TD width="46.2879px" height="30px">1.32</TD><TD width="350px" height="30px">The <STRONG>confirmation</STRONG> that the password has been resetted is shown.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="1-32.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323096i5B5B1CB0A4D66DAE/image-size/medium?v=v2&px=400" role="button" title="1-32.jpg" alt="1-32.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId-1172310728">Setup provisioning from SuccessFactors to Active Directory</H2><P><SPAN>The new API user's credentials are now being used to setup the SAP SuccessFactors connector for provisioning new employees to BestRun's corporate AD. This </SPAN>ensures that every employee managed in SF also gets a user account in AD which is required for SSO via SNC and Kerberos when accessing BestRun's SAP system(s) from a corporate AD domain-joined workstation.</P><TABLE border="1" width="744px"><TBODY><TR><TD width="46px" height="30px"><STRONG>Step</STRONG></TD><TD width="417px" height="30px"><STRONG>Description</STRONG></TD><TD width="281px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="46px" height="124px">2.1</TD><TD width="417px" height="124px"><P><STRONG>Login</STRONG><SPAN> with your Microsoft Entra tenant administrator to the </SPAN><A href="https://entra.microsoft.com/?Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true" target="_blank" rel="noopener nofollow noreferrer">Entra admin center</A><SPAN> with an </SPAN><STRONG>additional URL query parameter</STRONG><SPAN> </SPAN><EM>Microsoft_AAD_Connect_Provisioning_<BR />forceSchemaEditorEnabled</EM><SPAN> set to </SPAN><EM>true</EM><SPAN>: </SPAN><A href="https://entra.microsoft.com/?Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true" target="_blank" rel="nofollow noopener noreferrer">https://entra.microsoft.com/?Microsoft_AAD_Connect_Provisioning_forceSchemaEditorEnabled=true</A><SPAN>.</SPAN></P><P>Select <STRONG>Enterprise apps</STRONG> from the Entra tenant's main navigation menu.</P><P>Click <STRONG>New application</STRONG>.</P></TD><TD width="281px" height="124px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324672i56AFF37762D75ADB/image-size/medium?v=v2&px=400" role="button" title="5-1.jpg" alt="5-1.jpg" /></span></TD></TR><TR><TD width="46px" height="226px">2.2</TD><TD width="417px" height="226px"><P>Enter SuccessFactors to in the search bar.</P><P>Click the tile with label <STRONG>SuccessFactors to Active Directory User Provisioning</STRONG>.</P></TD><TD width="281px" height="226px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324673i59171A3BBEC8679C/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-2.jpg" alt="5-2.jpg" /></span></TD></TR><TR><TD width="46px" height="277px">2.3</TD><TD width="417px" height="277px"><P>Enter a name for the new enteprise app (for example <EM>SuccessFactors to Active Directory User Provisioning <your SF instance company ID></EM>)<STRONG>.</STRONG></P><P>Click <STRONG>Create</STRONG>.</P></TD><TD width="281px" height="277px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-3.jpg" style="width: 394px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324675i88765EAFE9C08493/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-3.jpg" alt="5-3.jpg" /></span></TD></TR><TR><TD width="46px" height="262px">2.4</TD><TD width="417px" height="262px">Select <STRONG>Provisioning</STRONG> from the navigation menu of the newly created enterprise app.</TD><TD width="281px" height="262px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324676i7AE754A575B97BDD/image-size/medium?v=v2&px=400" role="button" title="5-4.jpg" alt="5-4.jpg" /></span></TD></TR><TR><TD width="46px" height="446px">2.5</TD><TD width="417px" height="446px"><P>For the configuration settings in the next step, the distinguished name (DN) of the path in AD where new users should be created is required. </P><P>You can either create a new container in AD for the onboarded employees from SF, or use an existing one.</P><P>The screenshot shows the <STRONG>Active Directory Users and Computers</STRONG> tool with the default <STRONG>Users</STRONG> container selected and its properties dialog opened. From the tab <STRONG>Attribute Editor</STRONG>, the attribute <STRONG>distinguishedName</STRONG> is selected, and its value <EM>CN=Users,DC=corp,DC=bestrun,DC=com</EM> copied for the configuration of the following step (note that the <EM>DC</EM> (domain) components in your lab setup may be different.).</P></TD><TD width="281px" height="446px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324677iDFB51F0AF8E0FB5A/image-size/medium?v=v2&px=400" role="button" title="5-5.jpg" alt="5-5.jpg" /></span></TD></TR><TR><TD width="46px" height="476px">2.6</TD><TD width="417px" height="476px"><P>Select <STRONG>Provisioning</STRONG> from the navigation menu and expand the <STRONG>Admin Credentials</STRONG> section.</P><P> </P><P>Enter the following values:</P><UL><LI><STRONG>Tenant URL</STRONG>: Provide the tenant URL of your SF instance's API server which can be <A href="https://help.sap.com/docs/successfactors-platform/sap-successfactors-api-reference-guide-odata-v2/list-of-sap-successfactors-api-servers" target="_blank" rel="noopener noreferrer">looked-up here</A>. <STRONG>Note</STRONG>: Do <EM>not</EM> add the URL scheme (<EM>https://</EM>) to the value, but only the hostname.</LI><LI><STRONG>Default OU for New Users</STRONG>: Paste the value from the previous step, or enter any path in your corporate AD where you want new users to be created.</LI><LI><STRONG>Active Directory Domain</STRONG>: Select the domain from the drop-down box that your Entra Connect Sync agent is configured for.</LI><LI><STRONG>Admin Password</STRONG>: The vlaue you entered when resetting the new API user's password in step 1.31</LI><LI><STRONG>Admin Username</STRONG>: The name of the imported user in step 1.4 (<EM>entra_provisioning_user</EM>), followed by the <EM>@-</EM>sign and the company <SPAN>ID of your SF instance.</SPAN></LI></UL><P><SPAN>Click <STRONG>Test Connection</STRONG>.</SPAN></P></TD><TD width="281px" height="476px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-6.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324688i03D4877882494EFD/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-6.jpg" alt="5-6.jpg" /></span></TD></TR><TR><TD width="46px" height="179px">2.7</TD><TD width="417px" height="179px"><P><SPAN>Wait for the </SPAN><STRONG>confirmation</STRONG><SPAN> that the values could be successfully verified. Testing the connection also checks that the permissions of the provided API user are correctly set in the SF instance.</SPAN></P><P>Click<SPAN> </SPAN><STRONG>Save</STRONG>.</P></TD><TD width="281px" height="179px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-7.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324690iAB199D9C8B709667/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-7.jpg" alt="5-7.jpg" /></span></TD></TR><TR><TD width="46px" height="103px">2.8</TD><TD width="417px" height="103px"><P>Expand the<SPAN> </SPAN><STRONG>Mappings</STRONG><SPAN> </SPAN>section.</P><P>Click<SPAN> </SPAN><STRONG>Provision SuccessFactors Users</STRONG>.</P></TD><TD width="281px" height="103px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-8.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324691iE85923BF359F961E/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-8.jpg" alt="5-8.jpg" /></span></TD></TR><TR><TD width="46px" height="341px">2.9</TD><TD width="417px" height="341px"><P>By default, all employee records in the connected SF instance will be synchronized to Entra once provisioning is started.</P><P>For testing purposes of this scenario you will restrict provisioning to the test user only.</P><P>Click<SPAN> </SPAN><STRONG>All records</STRONG>.</P></TD><TD width="281px" height="341px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-9.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324692i73A9FF0C45F84FE7/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-9.jpg" alt="5-9.jpg" /></span></TD></TR><TR><TD width="46px" height="199px">2.10</TD><TD width="417px" height="199px">Click<SPAN> </SPAN><STRONG>Add new filter group</STRONG>.</TD><TD width="281px" height="199px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-10.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324693i2BAE8DA353E0FC92/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-10.jpg" alt="5-10.jpg" /></span></TD></TR><TR><TD width="46px" height="237px">2.11</TD><TD width="417px" height="237px"><P>Enter the following value for the new filter group:</P><UL><LI><STRONG>Source attribute</STRONG>: personIdExternal</LI><LI><STRONG>Operator</STRONG>: EQUALS</LI><LI><STRONG>Clause value</STRONG>:<SPAN> </SPAN><EM>llarson</EM></LI></UL><P>For the new<SPAN> </SPAN><STRONG>Scoping Filter Title</STRONG>, enter<SPAN> </SPAN><EM>Filter for llarson</EM>.</P><P>Click<SPAN> </SPAN><STRONG>Apply</STRONG>.</P></TD><TD width="281px" height="237px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-11.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324694i50E597A361BA319E/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-11.jpg" alt="5-11.jpg" /></span></TD></TR><TR><TD width="46px" height="286px">2.12</TD><TD width="417px" height="286px">Click<SPAN> </SPAN><STRONG>Apply</STRONG>.</TD><TD width="281px" height="286px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-12.jpg" style="width: 382px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324695iBA005EED2452341F/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-12.jpg" alt="5-12.jpg" /></span></TD></TR><TR><TD width="46px" height="222px">2.13</TD><TD width="417px" height="222px">For the <STRONG>userPrincipalName</STRONG> attribute mapping, click <STRONG>Edit</STRONG>.</TD><TD width="281px" height="222px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-13.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/326811i486719FD86D2A9CC/image-size/medium?v=v2&px=400" role="button" title="5-13.jpg" alt="5-13.jpg" /></span></TD></TR><TR><TD width="46px" height="251px">2.14</TD><TD width="417px" height="251px"><P>Change the <STRONG>expression</STRONG> from</P><PRE>[personIdExternal] </PRE><P>to</P><PRE>Join("@", [personIdExternal], "corp.bestrun.com")</PRE><P><STRONG>Replace</STRONG> "<EM>corp.bestrun.com</EM>" with your AD domain name.</P><P>Click <STRONG>Ok</STRONG>.</P></TD><TD width="281px" height="251px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="2-14.jpg" style="width: 376px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329624i0D3CD6B1B1A35025/image-size/medium?v=v2&px=400" role="button" title="2-14.jpg" alt="2-14.jpg" /></span></TD></TR><TR><TD width="46px" height="176px">2.15</TD><TD width="417px" height="176px"><SPAN>Click </SPAN><STRONG>Save</STRONG><SPAN> and confirm with </SPAN><STRONG>Yes</STRONG><SPAN>.</SPAN></TD><TD width="281px" height="176px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-15.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324746iDD3D0A40B06F915D/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-15.jpg" alt="5-15.jpg" /></span></TD></TR><TR><TD width="46px" height="56px">2.16</TD><TD width="417px" height="56px"><STRONG>Close</STRONG> the <STRONG>Attribute Mapping</STRONG> dialog box.</TD><TD width="281px" height="56px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-16.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/324747i38249571B6D687FE/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-16.jpg" alt="5-16.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId-975797223">Setup users and groups provisioning to SAP CIS in Entra</H2><P>To use the new features for <EM>groups provisioning</EM> and <EM>OAuth-based authentication</EM> in the SCIM-based SAP CIS provisioning connector, a new enterprise application will be created. You may want to remove the CIS enterprise app created in steps 6.1 to 6.23 of part II.</P><TABLE border="1"><TBODY><TR><TD width="46.3542px" height="30px"><STRONG>Step</STRONG></TD><TD width="364.875px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="46.3542px" height="136px">3.1</TD><TD width="364.875px" height="136px"><P>Select <STRONG>Enterprise apps</STRONG> from the Entra tenant's main navigation menu.</P><P>Click <STRONG>New application</STRONG>.</P></TD><TD width="350px" height="136px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="4-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323133i8F1A63EF538DD48D/image-size/medium?v=v2&px=400" role="button" title="4-1.jpg" alt="4-1.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="402px">3.2</TD><TD width="364.875px" height="402px"><P>Enter <EM>SAP Cloud Identity</EM> in the <STRONG>search bar</STRONG>.</P><P>Click on the tile with the label <STRONG>SAP Cloud Identity Services</STRONG>.</P></TD><TD width="350px" height="402px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="4-2.jpg" style="width: 337px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323134iE0A282BDAEC80CF2/image-size/medium?v=v2&px=400" role="button" title="4-2.jpg" alt="4-2.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="402px">3.3</TD><TD width="364.875px" height="402px"><P>Provide <STRONG>name</STRONG> for the new instance, for example <EM>SAP Cloud Identity Service (<your CIS tenant id>)</EM>.</P><P>Click <STRONG>Create</STRONG>.</P></TD><TD width="350px" height="402px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="4-3.jpg" style="width: 297px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323135i98257ECEB527B844/image-size/medium?v=v2&px=400" role="button" title="4-3.jpg" alt="4-3.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="285px">3.4</TD><TD width="364.875px" height="285px">Back on the <STRONG>Overview</STRONG> page, click the <STRONG>Provision User Accounts</STRONG> tile.</TD><TD width="350px" height="285px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="4-8.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323143i947680C34D8D9AB9/image-size/medium?v=v2&px=400" role="button" title="4-8.jpg" alt="4-8.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="730px">3.5</TD><TD width="364.875px" height="730px"><P>Switch the <STRONG>Provisioning Mode</STRONG> from <STRONG>Manual</STRONG> to <STRONG>Automatic</STRONG>.</P><P><STRONG>Expand</STRONG> the <STRONG>Admin Credentials</STRONG> section and enter the following values:</P><UL><LI><STRONG>Authentication Method: </STRONG><EM>OAuth2 Client Credentials Grant</EM></LI><LI><STRONG>Tenant URL</STRONG>: Provide the SCIM endpoint URL of your CIS tenant, for example <EM>https://<your tenant id>.accounts.ondemand.com/scim</EM></LI><LI><STRONG>Token Endpoint</STRONG>: The OAuth token endpoint URL of your CIS tenant (for example <EM>https://<your tenant id>.accounts.ondemand.com/oauth2/token</EM>). You can lookup the token endpoint in your CIS tenant's admin console by navigating to <STRONG>Applications and Resource -> Tenant settings -> Single Sign-On -> OpenID Connect Configuration</STRONG>. </LI><LI><STRONG>Client Credentials</STRONG>: Enter the value for Client ID captured in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_blank">step 4.7 of part II</A>.</LI><LI><STRONG>Client Secret</STRONG>: Enter the value for Client secret captured in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_blank">step 4.7 of part II</A>.</LI></UL><P>Click <STRONG>Test Connection</STRONG>.</P></TD><TD width="350px" height="730px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="4-9.jpg" style="width: 348px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323144i3BCBCD4B1FA953A3/image-size/medium?v=v2&px=400" role="button" title="4-9.jpg" alt="4-9.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="181px">3.6</TD><TD width="364.875px" height="181px"><P>Wait for the <STRONG>confirmation</STRONG> that the configuration has been tested successfully.</P><P>Click <STRONG>Save</STRONG>.</P></TD><TD width="350px" height="181px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="4-10.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/323145i7FF8A69083A431E2/image-size/medium?v=v2&px=400" role="button" title="4-10.jpg" alt="4-10.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="218px">3.7</TD><TD width="364.875px" height="218px"><P>Next, adjust the mappings to add the user's on-premise principal name as the SAP user name.</P><P><STRONG>Expand</STRONG> the <STRONG>Mappings</STRONG> section.</P><P>Click <STRONG>Provision Microsoft Entra ID Users</STRONG>. </P></TD><TD width="350px" height="218px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="3-7.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329694iBDC55959E9C17580/image-size/medium?v=v2&px=400" role="button" title="3-7.jpg" alt="3-7.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="402px">3.8</TD><TD width="364.875px" height="402px"><P>Activate the checkbox<SPAN> </SPAN><STRONG>Show advanced options</STRONG>.</P><P>By accessing the Microsoft Entra Admin Center with the addition URL query parameter in step 2.1, the additional option to edit the attributes for Entra appears in the<SPAN> </SPAN><STRONG>Supported Attributes</STRONG><SPAN> </SPAN>section.</P><P>Click<SPAN> </SPAN><STRONG>Edit attribute list for Microsoft Entra ID</STRONG>.</P></TD><TD width="350px" height="402px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="3-8.jpg" style="width: 246px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329695i2151DBD168134851/image-size/medium?v=v2&px=400" role="button" title="3-8.jpg" alt="3-8.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="403px">3.9</TD><TD width="364.875px" height="403px"><P>Scroll down to the last row in the table and enter</P><PRE>onPremisesUserPrincipalName</PRE><P>in the attribute<SPAN> </SPAN><STRONG>name</STRONG><SPAN> </SPAN>field.</P><P>Click<SPAN> </SPAN><STRONG>Save</STRONG>, and confirm with<SPAN> </SPAN><STRONG>Yes</STRONG>.</P></TD><TD width="350px" height="403px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="3-9.jpg" style="width: 306px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329697iD9D8C8031DB15C7F/image-size/medium?v=v2&px=400" role="button" title="3-9.jpg" alt="3-9.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="176px">3.10</TD><TD width="364.875px" height="176px">Click <STRONG>Edit attribute list for SAP Cloud Identity Services</STRONG>.</TD><TD width="350px" height="176px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="3-10.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329698i74703557BD30CF93/image-size/medium?v=v2&px=400" role="button" title="3-10.jpg" alt="3-10.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="195px">3.11</TD><TD width="364.875px" height="195px"><P>Scroll down to the last row in the table and enter</P><PRE>urn:ietf:params:scim:schemas:extension:sap:<BR />2.0:User:sapUserName</PRE><P>in the attribute<SPAN> </SPAN><STRONG>name</STRONG><SPAN> </SPAN>field.</P><P>Click<SPAN> </SPAN><STRONG>Save</STRONG>, and confirm with<SPAN> </SPAN><STRONG>Yes</STRONG>.</P></TD><TD width="350px" height="195px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="3-11.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329699iCFB95D3AB070BF76/image-size/medium?v=v2&px=400" role="button" title="3-11.jpg" alt="3-11.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="283px">3.12</TD><TD width="364.875px" height="283px">Click <STRONG>Add New Mapping</STRONG>.</TD><TD width="350px" height="283px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="3-12.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329700i22F97F8770DDB648/image-size/medium?v=v2&px=400" role="button" title="3-12.jpg" alt="3-12.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="358px">3.13</TD><TD width="364.875px" height="358px"><P>Select "Expression" for<SPAN> </SPAN><STRONG>Mapping type</STRONG>.</P><P>The Entra attribute "<SPAN>onPremisesUserPrincipalName"</SPAN><SPAN> </SPAN>added in step 3.9 has the format "<Windows user name>@<Kerberos realm name>". The<SPAN> </SPAN><EM>SAP login name</EM><SPAN> </SPAN>should be equal to the<SPAN> </SPAN><EM>Windows user name</EM> that can be considered unique across all users in the organization.</P><P>The following expression<SPAN> </SPAN><A href="https://learn.microsoft.com/en-us/entra/identity/app-provisioning/functions-for-customizing-application-data#split" target="_blank" rel="noopener nofollow noreferrer">extracts</A><SPAN> </SPAN>the Windows user name from the "onPremisesUserPrincipalName" and converts it<SPAN> </SPAN><SPAN><A href="https://learn.microsoft.com/en-us/entra/identity/app-provisioning/functions-for-customizing-application-data#toupper" target="_blank" rel="noopener nofollow noreferrer">to upper case</A> for the SAP login name:</SPAN></P><PRE>Item(Split([onPremisesUserPrincipalName], "@"), 1)</PRE><P><SPAN>Enter this string for the <STRONG>Expression</STRONG>.</SPAN></P><P><SPAN>As the <STRONG>Target attribute</STRONG>, select "<EM>urn:ietf:params:scim:schemas:extension:sap: 2.0:User:sapUserName</EM>" from the list.</SPAN></P><P><SPAN>Click <STRONG>Ok</STRONG>.</SPAN></P></TD><TD width="350px" height="358px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="3-13.jpg" style="width: 382px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329702i7C8E3B6ED1F877F9/image-size/medium?v=v2&px=400" role="button" title="3-13.jpg" alt="3-13.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">3.14</TD><TD width="364.875px" height="30px">Click <STRONG>Save</STRONG>.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="3-14.jpg" style="width: 296px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329703iD1118C28FD471D3D/image-size/medium?v=v2&px=400" role="button" title="3-14.jpg" alt="3-14.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId-779283718">Configure permissions in Entra for provisioning of groups from CIS</H2><P>CIS provisions the groups (representing the PFCG roles in the SAP backend) with the Graph API to Entra. The required permissions to do so are configured in this step in the application registration created as part of the enterprise app for CIS. </P><TABLE border="1"><TBODY><TR><TD width="46.3542px" height="30px"><STRONG>Step</STRONG></TD><TD width="350px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="46.3542px" height="282px">4.1</TD><TD width="350px" height="282px"><P>From the navigation menu, select <STRONG>App registrations</STRONG>.</P><P>On the <STRONG>All applications</STRONG> tab, search for the name of your enterprise app chosen in step 3.3, for example <EM>SAP Cloud Identity Services (<tenant id>).</EM></P><P><STRONG>Select</STRONG> the application registration for the CIS enterprise app from the search results.</P></TD><TD width="350px" height="282px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327207i03F6B4E3A6A72E7A/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-1.jpg" alt="5-1.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="300px">4.2</TD><TD width="350px" height="300px"><P>Select <STRONG>Certificates & Secrets</STRONG> from the navigation menu.</P><P>Switch to the <STRONG>Client secrets</STRONG> tab.</P><P>Click <STRONG>New client secret</STRONG>.</P></TD><TD width="350px" height="300px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327208i0586C3A913EE0848/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-2.jpg" alt="5-2.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="137px">4.3</TD><TD width="350px" height="137px"><P>Enter a <STRONG>description</STRONG> for the new secret, for example <EM>Entra Provisioning </EM>and select an <STRONG>expiration</STRONG> period.</P><P>Click <STRONG>Add</STRONG>.</P></TD><TD width="350px" height="137px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327210iB93CCD71FB992396/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-3.jpg" alt="5-3.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="103px">4.4</TD><TD width="350px" height="103px"><STRONG>Copy</STRONG> the <STRONG>value</STRONG> of the new secret to the clipboard and paste it to a temporary text file. It will be used in a later step.</TD><TD width="350px" height="103px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327212iAA9CC4EEB6CC3EC6/image-size/medium?v=v2&px=400" role="button" title="5-4.jpg" alt="5-4.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="248px">4.5</TD><TD width="350px" height="248px"><P>Select <STRONG>API permissions</STRONG> from the navigation menu.</P><P>Click <STRONG>Add a permission</STRONG>.</P></TD><TD width="350px" height="248px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327293iA7C5257E8572075F/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-5.jpg" alt="5-5.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="209px">4.6</TD><TD width="350px" height="209px">From the <STRONG>Microsoft APIs</STRONG>, click on the <STRONG>Microsoft Graph</STRONG> tile.</TD><TD width="350px" height="209px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-6.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327294iDAD21873B05014AA/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-6.jpg" alt="5-6.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="404px">4.7</TD><TD width="350px" height="404px"><P>CIS calls the Graph APIs on its own behalf, and not on-behalf-of a signed-in user. Therefore, select <STRONG>Application permissions</STRONG>.</P><P>In the <STRONG>search</STRONG> bar, start typing <EM>Group.ReadWrite.</EM></P><P>From the result list, activate the checkbox for the permission <STRONG>Group.ReadWrite.All</STRONG>.</P><P>Click <STRONG>Add permissions</STRONG>.</P><P><STRONG><span class="lia-unicode-emoji" title=":loudspeaker:">📢</span>Note</STRONG>: To follow the <A href="https://en.wikipedia.org/wiki/Principle_of_least_privilege" target="_blank" rel="noopener nofollow noreferrer"><EM>least privilege principle,</EM></A> only the permissions required for this scenario are added. Although CIS can also provision users to Entra, which would require an additional Graph API permission, we do not use this feature, and therefore only add the permission to manage groups.</P></TD><TD width="350px" height="404px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-7.jpg" style="width: 242px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327295iC032A3B4542BC599/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-7.jpg" alt="5-7.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="82px">4.8</TD><TD width="350px" height="82px">To approve the new permission, provide the required admin consent by clicking <STRONG>Grant admin consent for <your tenant domain></STRONG>.</TD><TD width="350px" height="82px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-8.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327296iB2D3D091D7AC8BF2/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="5-8.jpg" alt="5-8.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="166px">4.9</TD><TD width="350px" height="166px"><P>Select <STRONG>Overview</STRONG> from the navigation menu.</P><P><STRONG>Copy</STRONG> the <STRONG>Application (client) ID</STRONG> to the clipboard, and paste it to the temporary text file where you've already kept the secret value.</P></TD><TD width="350px" height="166px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327258iA977DE771BC2986E/image-size/medium?v=v2&px=400" role="button" title="5-5.jpg" alt="5-5.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="131px">4.10</TD><TD width="350px" height="131px">Click <STRONG>Endpoints</STRONG>.</TD><TD width="350px" height="131px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="5-6.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327259iA021C493FA89024E/image-size/medium?v=v2&px=400" role="button" title="5-6.jpg" alt="5-6.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="226px">4.11</TD><TD width="350px" height="226px"><STRONG>Copy</STRONG> the <STRONG>OAuth 2.0 token endpoint (v1)</STRONG> to the clipboard and paste it to the temporary text file where you've already kept the other configuration values.</TD><TD width="350px" height="226px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="MartinRaepple_0-1760555633386.jpeg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328060iE6CF4E321AAF7DA9/image-size/medium?v=v2&px=400" role="button" title="MartinRaepple_0-1760555633386.jpeg" alt="MartinRaepple_0-1760555633386.jpeg" /></span><P> </P></TD></TR></TBODY></TABLE><H2 id="toc-hId-582770213">Add SAP as source system in IPS</H2><P>Now it is time to configure the additional <EM>source system</EM> in IPS for <EM>reading</EM> roles from the backend and create the groups from them in the tenant's local directory.</P><TABLE border="1"><TBODY><TR><TD width="46.2879px" height="30px"><STRONG>Step</STRONG></TD><TD width="350px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD>5.1</TD><TD><P><STRONG>Login</STRONG> as the CIS administrator to your <STRONG>CIS tenant's admin console</STRONG> at https://<tenantID>.accounts.ondemand.com/admin.</P><P>From the <STRONG>Identity Provisioning</STRONG> menu, select <STRONG>Source Systems</STRONG>.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="6-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327298i1ACEE3B172FF52EB/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="6-1.jpg" alt="6-1.jpg" /></span></TD></TR><TR><TD>5.2</TD><TD>Click <STRONG>Add</STRONG>.</TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="6-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327302i34B464E2D8AE2999/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="6-2.jpg" alt="6-2.jpg" /></span></TD></TR><TR><TD>5.3</TD><TD><P>You will create the new source system from a file, which can be found in the tutorial series <A href="https://github.com/raepple/iam-with-entra/tree/main/part3" target="_blank" rel="nofollow noopener noreferrer">GitHub repository. </A></P><P>Click <STRONG>Browse...</STRONG> and open the file <A href="https://github.com/raepple/iam-with-entra/blob/bcb4b9e7bf94904c5d675b28e800a679b5c86352/part3/SAP%20A4H%20Source%20System.json" target="_blank" rel="noopener nofollow noreferrer">SAP A4H Source System.json</A> from the file dialog.</P><P>Click <STRONG>Save</STRONG>.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="6-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327445i1165420C499BB759/image-size/medium?v=v2&px=400" role="button" title="6-3.jpg" alt="6-3.jpg" /></span></TD></TR><TR><TD>5.4</TD><TD><P>Switch to the <STRONG>Transformations</STRONG> tab to review the configuration.</P><P>Only roles are read from the SAP Application Server ABAP and created as groups in CIS. Reading users from ABAP has been removed from the transformation settings, because Entra is the SOA for them in this scenario.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="6-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327446i03CCECBD78497658/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="6-4.jpg" alt="6-4.jpg" /></span></TD></TR><TR><TD>5.5</TD><TD>Switch to the <STRONG>Properties</STRONG> tab. For testing purposes, the <EM>abap.role.name.filter</EM> property is set on the source system to only read roles starting with the string SAP_BC_EPM.</TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="6-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327447i19F6190E240FF571/image-size/medium?v=v2&px=400" role="button" title="6-5.jpg" alt="6-5.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId-386256708">Add Entra tenant as target system in IPS</H2><TABLE border="1"><TBODY><TR><TD width="46.2879px" height="30px"><STRONG>Step</STRONG></TD><TD width="350px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD>6.1</TD><TD>Select <STRONG>Target Systems</STRONG> from the <STRONG>Identity Provisioning</STRONG> menu.</TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327454i2F9769038007B985/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="7-1.jpg" alt="7-1.jpg" /></span></TD></TR><TR><TD>6.2</TD><TD>Click <STRONG>Add</STRONG>.</TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327455i96684903D4D04867/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="7-2.jpg" alt="7-2.jpg" /></span></TD></TR><TR><TD>6.3</TD><TD><P>Click <STRONG>Browse...</STRONG> and select the file <SPAN><A href="https://github.com/raepple/iam-with-entra/blob/bcb4b9e7bf94904c5d675b28e800a679b5c86352/part3/Entra%20ID%20Target%20System.json" target="_blank" rel="noopener nofollow noreferrer">Entra ID Target System.json</A> from the <A href="https://github.com/raepple/iam-with-entra/tree/main/part3" target="_blank" rel="nofollow noopener noreferrer">GitHub repository</A>.</SPAN></P><P><SPAN>Switch to the <STRONG>Properties</STRONG> tab.</SPAN></P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327466iEC04E4830B9B0D86/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="7-3.jpg" alt="7-3.jpg" /></span></TD></TR><TR><TD>6.4</TD><TD><P>Paste the values from your temporary text file into the following properties:</P><UL><LI><STRONG>OAuth2TokenServiceURL</STRONG>: Value for the <STRONG>OAuth 2.0 token endpoint (v1)</STRONG> copied in step 4.11</LI><LI><STRONG>Password</STRONG>: Value for the <STRONG>secret</STRONG> copied in step 4.4</LI><LI><STRONG>User</STRONG>: Value for the <STRONG>Application (client) ID</STRONG> copied in step 4.9</LI></UL><P>Click <STRONG>Save</STRONG>.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327472iAF5AEF0A3C848041/image-size/medium?v=v2&px=400" role="button" title="7-4.jpg" alt="7-4.jpg" /></span></TD></TR><TR><TD>6.5</TD><TD><P>Switch to the <STRONG>Transformations</STRONG> tab to review the imported configuration.</P><P>Similar to the new source system, the target systems also only provisions groups to Entra. Users have been removed from the default transformation.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/327474iAA9A0B6E9D67C804/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="7-5.jpg" alt="7-5.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId-189743203">Provision the PFCG roles as groups to Entra</H2><P>To continue with the configuration in Entra ID Governance for the <EM>SAP EPM</EM> access package which includes the <EM>SAP_BC_EPM_DEMO, </EM>this group must be provisioned first from the SAP system via CIS to Entra. With the configuration of the new source and target system in CIS, you can start this initial provisioning.</P><TABLE border="1"><TBODY><TR><TD width="46.3542px" height="30px"><STRONG>Step</STRONG></TD><TD width="315.292px" height="30px"><STRONG>Description</STRONG></TD><TD width="315px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="46.3542px" height="200px">7.1</TD><TD width="315.292px" height="200px"><P>Select <STRONG>Source Systems</STRONG> from the <STRONG>Identity Provisioning</STRONG> menu.</P><P>From the list of <STRONG>Customer Managed</STRONG> source systems, select the <STRONG>SAP A4H</STRONG> source system.</P><P>Switch to the <STRONG>Jobs</STRONG> tab.</P></TD><TD width="315px" height="200px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328077iB5B0BB5584EF9636/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="7-1.jpg" alt="7-1.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">7.2</TD><TD width="315.292px" height="30px">Click <STRONG>Run Now</STRONG> for the <STRONG>Read Job</STRONG> type.</TD><TD width="315px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328079i5C498752E1408D68/image-size/medium?v=v2&px=400" role="button" title="7-2.jpg" alt="7-2.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">7.3</TD><TD width="315.292px" height="30px">Select <STRONG>Provisioning Logs</STRONG> from the <STRONG>Identity Provisioning</STRONG> menu.</TD><TD width="315px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328080i4FE62ADE19D4102B/image-size/medium?v=v2&px=400" role="button" title="7-3.jpg" alt="7-3.jpg" /></span></TD></TR><TR><TD>7.4</TD><TD><STRONG>Select</STRONG> the first job for the <STRONG>SAP A4H</STRONG> source system from the list to view the execution logs.</TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328081i34F02D28746F2E5D/image-size/medium?v=v2&px=400" role="button" title="7-4.jpg" alt="7-4.jpg" /></span></TD></TR><TR><TD>7.5</TD><TD><P>After the job has finished, check the <STRONG>job log statistics</STRONG>.</P><P>You can see the number of <EM>roles</EM> read from the source system SAP A4H and the same number of <STRONG>groups</STRONG> written to (created in) Entra ID.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="7-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328082iD6C6B9AB295D76DA/image-size/medium?v=v2&px=400" role="button" title="7-5.jpg" alt="7-5.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId--6770302">Create the SAP EPM Access Package</H2><P>The following steps guide you through the process of creating the SAP EPM access package that will contain the previously provisioned SAP_BC_EPM_DEMO group.</P><TABLE border="1"><TBODY><TR><TD width="46.3542px" height="30px"><STRONG>Step</STRONG></TD><TD width="350px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="46.3542px" height="246px">8.1</TD><TD width="350px" height="246px"><P>Go back to the <A href="https://entra.microsoft.com/#home" target="_blank" rel="noopener nofollow noreferrer">Entra admin center</A>.</P><P>Expand the <STRONG>ID Governance</STRONG> section and select <STRONG>Entitlement management</STRONG> from the navigation menu.</P><P>Select <STRONG>Access packages</STRONG> from the submenu.</P></TD><TD width="350px" height="246px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328083i88EDB06BFBF8CDB3/image-size/medium?v=v2&px=400" role="button" title="8-1.jpg" alt="8-1.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">8.2</TD><TD width="350px" height="30px">Click <STRONG>New access package</STRONG>.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328084iD3C98BBA1EB47555/image-size/medium?v=v2&px=400" role="button" title="8-2.jpg" alt="8-2.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">8.3</TD><TD width="350px" height="30px"><P>Enter <EM>SAP EPM</EM> for the <STRONG>name</STRONG>, and provide a <STRONG>description</STRONG>, for example <EM>Access to SAP Enterprise Procurement Model demo app</EM>.</P><P>Click <STRONG>Next: Resource roles</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328085iB30800C1BF3ABEA9/image-size/medium?v=v2&px=400" role="button" title="8-3.jpg" alt="8-3.jpg" /></span></TD></TR><TR><TD>8.4</TD><TD>Click <STRONG>Groups and Teams</STRONG>.</TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328086i7711BC4C90662FC6/image-size/medium?v=v2&px=400" role="button" title="8-4.jpg" alt="8-4.jpg" /></span></TD></TR><TR><TD>8.5</TD><TD><P><STRONG>Activate</STRONG> the checkbox <STRONG>See all Group and Team(s) not in the 'General' catalog</STRONG>.</P><P>Enter <EM>SAP_BC_EPM</EM> in the search field and <STRONG>activate</STRONG> the checkbox for the <EM>SAP_BC_EPM_DEMO</EM> group.</P><P>Click <STRONG>Select</STRONG>.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328087iD7468679AF2ED012/image-size/medium?v=v2&px=400" role="button" title="8-5.jpg" alt="8-5.jpg" /></span></TD></TR><TR><TD>8.6</TD><TD><P>From the <STRONG>Role</STRONG> drop-down box, select <STRONG>Member</STRONG>.</P><P>Click <STRONG>Next: Requests</STRONG></P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-6.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328088i8B895A00364C4CC7/image-size/medium?v=v2&px=400" role="button" title="8-6.jpg" alt="8-6.jpg" /></span></TD></TR><TR><TD>8.7</TD><TD><P>Select <STRONG>For users in your directory</STRONG> from the <STRONG>Users who can request access</STRONG> options.</P><P>Select <STRONG>All members (excluding guests)</STRONG>.</P><P>Set <STRONG>Require approval</STRONG> to <STRONG>No</STRONG>.</P><P>Click <STRONG>Next: Requestor information</STRONG>.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-7.jpg" style="width: 336px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328089i7A74A7E5FF328FF0/image-size/medium?v=v2&px=400" role="button" title="8-7.jpg" alt="8-7.jpg" /></span></TD></TR><TR><TD>8.8</TD><TD><P>Click <STRONG>Next: Lifecycle</STRONG>.</P><P>Choose <STRONG>Never</STRONG> from the <STRONG>Access package assignments expire</STRONG> options.</P><P>Set <STRONG>User can request specific timeline</STRONG> to <STRONG>No</STRONG>.</P><P>Click <STRONG>Next: Rules</STRONG>.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-8.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328090i37DC2BC1EA38C54C/image-size/medium?v=v2&px=400" role="button" title="8-8.jpg" alt="8-8.jpg" /></span></TD></TR><TR><TD>8.9</TD><TD><P>Click <STRONG>Next: Review + Create</STRONG>.</P><P>Click <STRONG>Create</STRONG>.</P></TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-9.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328091iB7281A6583E93E06/image-size/medium?v=v2&px=400" role="button" title="8-9.jpg" alt="8-9.jpg" /></span></TD></TR><TR><TD>8.10</TD><TD><STRONG>Copy</STRONG> from the newly created access package the <STRONG>link to the My Access portal</STRONG> and paste it to a temporary text file.</TD><TD><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="8-10.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328092i2F930C666A3F33AD/image-size/medium?v=v2&px=400" role="button" title="8-10.jpg" alt="8-10.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId-143970550">Onboard the new employee in SuccessFactors</H2><P>As the HR admin, go back to SuccessFactors and onboard the new employee Linda Larson. </P><TABLE border="1"><TBODY><TR><TD width="46.3542px" height="30px"><STRONG>Step</STRONG></TD><TD width="350px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="46.3542px" height="30px">9.1</TD><TD width="350px" height="30px">In the <STRONG>search bar</STRONG>, start typing <STRONG>Add new employee</STRONG> and select the action from the search results.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="9-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328097i6B5143B6DF5230A9/image-size/medium?v=v2&px=400" role="button" title="9-1.jpg" alt="9-1.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">9.2</TD><TD width="350px" height="30px"><P>In the <STRONG>Identity</STRONG> section, leave the default <STRONG>Hire Date (today)</STRONG>, select a <STRONG>Company</STRONG> and <STRONG>Event Reason</STRONG> (for example <STRONG>New Hire</STRONG>) from the list.</P><P>Enter the following <STRONG>Name information</STRONG>:</P><UL><LI><STRONG>First Name</STRONG>: Linda</LI><LI><STRONG>Last Name</STRONG>: Larson</LI><LI><STRONG>Display Name</STRONG>: Linda Larson</LI></UL><P>In <STRONG>Employee Information</STRONG>, enter <EM>llarson</EM> for the <STRONG>Person Id</STRONG>.</P><P>Click <STRONG>Continue</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="MartinRaepple_0-1760568541179.jpeg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328105iDE2201F872428532/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="MartinRaepple_0-1760568541179.jpeg" alt="MartinRaepple_0-1760568541179.jpeg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">9.3</TD><TD width="350px" height="30px">Keep the default settings in <STRONG>Personal information</STRONG> and click <STRONG>Continue</STRONG>.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="9-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328099i6725EC450B584143/image-size/medium?v=v2&px=400" role="button" title="9-3.jpg" alt="9-3.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">9.4</TD><TD width="350px" height="30px"><P>In Job information, select a <STRONG>Job Classification</STRONG> from the list.</P><P>Click <STRONG>Continue</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="9-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328100i5B93C0516C94A3F5/image-size/medium?v=v2&px=400" role="button" title="9-4.jpg" alt="9-4.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">9.5</TD><TD width="350px" height="30px">Click <STRONG>Submit</STRONG>.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="9-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328102i39875625BB9732FA/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="9-5.jpg" alt="9-5.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">9.6</TD><TD width="350px" height="30px">Click <STRONG>View Profile of Linda Larson</STRONG>.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="9-6.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328103i167F14F1B1F5A95F/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="9-6.jpg" alt="9-6.jpg" /></span></TD></TR><TR><TD width="46.3542px" height="30px">9.7</TD><TD width="350px" height="30px">The profile of the new onboarded employee is shown.</TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="9-7.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/328104i78245570FFF99425/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="9-7.jpg" alt="9-7.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId--52542955">Provision the new employee to AD and Entra</H2><P>Next, you will provision the new employee to AD with the enterprise app configured for SuccessFactors in steps 1 ff. From there, an account in Entra gets created with Cloud Sync, and an alternative e-mail address is set by the administrator. This is required for the self-service password reset when the new onboarded user logs-in for the first time in the next section. We'll explore more sophisticated mechanisms for the employee onboarding process and initial login experience with <A href="https://learn.microsoft.com/en-us/entra/id-governance/what-are-lifecycle-workflows" target="_blank" rel="noopener nofollow noreferrer">Entra ID Governance lifecycle workflows</A> in one of the next parts of this blog series.</P><TABLE border="1"><TBODY><TR><TD width="49.1771px" height="30px"><STRONG>Step</STRONG></TD><TD width="350px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="49.1771px" height="171px">10.1</TD><TD width="350px" height="171px"><P>Select <STRONG>Enterprise apps</STRONG> from the navigation menu.</P><P>In the search field, enter the name of your SuccessFactors app created in step 2.3.</P><P><STRONG>Select</STRONG> the app from the search results list.</P></TD><TD width="350px" height="171px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329325iFF03CC73D2740FE1/image-size/medium?v=v2&px=400" role="button" title="10-1.jpg" alt="10-1.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="402px">10.2</TD><TD width="350px" height="402px">Select <STRONG>Provisioning</STRONG> from the app's menu.</TD><TD width="350px" height="402px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-2.jpg" style="width: 272px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329326i5842A751E6121ADC/image-size/medium?v=v2&px=400" role="button" title="10-2.jpg" alt="10-2.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="284px">10.3</TD><TD width="350px" height="284px"><P>Select <STRONG>Provisioning on demand</STRONG> from the menu.</P><P>Enter the new employees <STRONG>personId</STRONG> from step 9.2 in the <STRONG>Select a user</STRONG> field.</P><P>Click <STRONG>Provision</STRONG>.</P></TD><TD width="350px" height="284px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329327i351448A4BDB6043E/image-size/medium?v=v2&px=400" role="button" title="10-3.jpg" alt="10-3.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="140px">10.4</TD><TD width="350px" height="140px"><P>The new employee's user account gets created in AD and the results are shown.</P><P>Click <STRONG>Close</STRONG>.</P></TD><TD width="350px" height="140px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329328iAE55D35C536C6C07/image-size/medium?v=v2&px=400" role="button" title="10-4.jpg" alt="10-4.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="402px">10.5</TD><TD width="350px" height="402px"><P>On your DC, open the <STRONG>Active Directory Users and Computers (ADUC)</STRONG> tool. </P><P>Navigate to the path where you provision new users from SF to (as configured in step 2.6).</P><P>Search for the new user and open the <STRONG>Properties</STRONG> for it.</P></TD><TD width="350px" height="402px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-5.jpg" style="width: 306px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329329i4B491D2A0B3690A2/image-size/medium?v=v2&px=400" role="button" title="10-5.jpg" alt="10-5.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="402px">10.6</TD><TD width="350px" height="402px"><P>Switch to the <STRONG>Attribute Editor</STRONG> tab.</P><P>Search for the <STRONG>distinguishedName</STRONG> attribute.</P><P>Click <STRONG>View</STRONG>.</P></TD><TD width="350px" height="402px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-6.jpg" style="width: 325px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329330iCE96C3120BB2FFDF/image-size/medium?v=v2&px=400" role="button" title="10-6.jpg" alt="10-6.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="206px">10.7</TD><TD width="350px" height="206px"><STRONG>Copy</STRONG> the value of the attribute to the clipboard.</TD><TD width="350px" height="206px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-7.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329331iF675B782CF94CF62/image-size/medium?v=v2&px=400" role="button" title="10-7.jpg" alt="10-7.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="230px">10.8</TD><TD width="350px" height="230px">Go back to the Entra admin center and select <STRONG>Entra Connect</STRONG> from the top navigation menu.</TD><TD width="350px" height="230px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-8.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329332i40EA820540EDB96D/image-size/medium?v=v2&px=400" role="button" title="10-8.jpg" alt="10-8.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="231px">10.9</TD><TD width="350px" height="231px">Select <STRONG>Cloud Sync</STRONG>.</TD><TD width="350px" height="231px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-9.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329333iB6A46B7A2390CB2E/image-size/medium?v=v2&px=400" role="button" title="10-9.jpg" alt="10-9.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="125px">10.10</TD><TD width="350px" height="125px"><STRONG>Click</STRONG> on your <STRONG>AD to Microsoft Entra ID</STRONG> configuration from the list.</TD><TD width="350px" height="125px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-10.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329334i7F87EDDD836386EF/image-size/medium?v=v2&px=400" role="button" title="10-10.jpg" alt="10-10.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="245px">10.11</TD><TD width="350px" height="245px"><P>Select <STRONG>Provision on demand</STRONG> from the menu.</P><P><STRONG>Paste</STRONG> the new AD user's distinguished name attribute value from the clipboard into the <STRONG>Enter a user </STRONG>field.</P><P>Click <STRONG>Provison</STRONG>.</P></TD><TD width="350px" height="245px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-11.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329335i53D1AF01F77EBB1C/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="10-11.jpg" alt="10-11.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="30px">10.12</TD><TD width="350px" height="30px"><P>Entra will search for the user in AD, create the new account, and display the results.</P><P>Click <STRONG>Close</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-12.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329336i1ED486213BCBE2B5/image-size/medium?v=v2&px=400" role="button" title="10-12.jpg" alt="10-12.jpg" /></span></TD></TR><TR><TD width="49.1771px">10.13</TD><TD width="350px"><P>From the top navigation menu, select <STRONG>Users</STRONG>.</P><P>Search for the new user by entering its user name.</P><P><STRONG>Select</STRONG> the new user from the list.</P></TD><TD width="350px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-13.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329427i60F18FBB9A5BACEC/image-size/medium?v=v2&px=400" role="button" title="10-13.jpg" alt="10-13.jpg" /></span></TD></TR><TR><TD width="49.1771px">10.14</TD><TD width="350px">Click <STRONG>Edit properties</STRONG>.</TD><TD width="350px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-14.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329429iAB76A1BE2698A02C/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="10-14.jpg" alt="10-14.jpg" /></span></TD></TR><TR><TD width="49.1771px">10.15</TD><TD width="350px"><P>Switch to the <STRONG>Contact Information</STRONG> tab.</P><P>Click <STRONG>Add or edit other emails</STRONG>.</P></TD><TD width="350px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-15.jpg" style="width: 330px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329430i261721AE76D879EE/image-size/medium?v=v2&px=400" role="button" title="10-15.jpg" alt="10-15.jpg" /></span></TD></TR><TR><TD width="49.1771px">10.16</TD><TD width="350px"><P>Enter an email address in the field that you have access to for testing purposes. This <EM>must not be</EM> the new users primary email address.</P><P>Click <STRONG>Save</STRONG>.</P></TD><TD width="350px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-16.jpg" style="width: 232px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329431i155E5613F5EE6C73/image-size/medium?v=v2&px=400" role="button" title="10-16.jpg" alt="10-16.jpg" /></span></TD></TR><TR><TD width="49.1771px">10.17</TD><TD width="350px">Click <STRONG>Save</STRONG>.</TD><TD width="350px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="10-17.jpg" style="width: 284px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329432i65FD0EABB5BFE861/image-size/medium?v=v2&px=400" role="button" title="10-17.jpg" alt="10-17.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId--249056460">Request the SAP EPM access package</H2><P>Before making the request for the SAP EPM access package, the new employee Linda Larson has to (re)set her password in Entra using the <A href="https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr" target="_blank" rel="noopener nofollow noreferrer">self-service password reset in Entra ID</A>. and subsequentely also for her user account in AD with the <A href="https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-cloud-sync-sspr-writeback" target="_blank" rel="noopener nofollow noreferrer">SSPR password writeback option enabled</A> as listed in the prerequisites section of this tutorial.</P><TABLE border="1" width="743px"><TBODY><TR><TD width="49.1771px" height="30px"><STRONG>Step</STRONG></TD><TD width="346.573px" height="30px"><STRONG>Description</STRONG></TD><TD width="346.583px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="49.1771px" height="263px">11.1</TD><TD width="346.573px" height="263px"><P>Open a new <STRONG>private browser</STRONG> window.</P><P>Open the <STRONG>URL to the My Access portal</STRONG> copied in step 8.10.</P><P>On the login page, enter your new employees login name or primary email address.</P><P>Click <STRONG>Next</STRONG>.</P><P>Select the <STRONG>Forgot my password</STRONG> link.</P></TD><TD width="346.583px" height="263px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329436i44B7C66CB22EF224/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="11-1.jpg" alt="11-1.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="244px">11.2</TD><TD width="346.573px" height="244px"><P>Enter the character and numbers as shown in <A href="https://en.wikipedia.org/wiki/CAPTCHA" target="_blank" rel="noopener nofollow noreferrer">CAPTCHA</A>.</P><P>Click <STRONG>Next</STRONG>.</P></TD><TD width="346.583px" height="244px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329437i2212FDE7A0F3A476/image-size/medium?v=v2&px=400" role="button" title="11-2.jpg" alt="11-2.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="159px">11.3</TD><TD width="346.573px" height="159px"><P>Select the <STRONG>I forgot my password</STRONG> option.</P><P>Click <STRONG>Next</STRONG>.</P></TD><TD width="346.583px" height="159px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329438iC851099DDCBC8132/image-size/medium?v=v2&px=400" role="button" title="11-3.jpg" alt="11-3.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="173px">11.4</TD><TD width="346.573px" height="173px">Click <STRONG>Email</STRONG> to send a verification code to your alternative email address provided in step 10.16.</TD><TD width="346.583px" height="173px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329439i1D46748491E026CC/image-size/medium?v=v2&px=400" role="button" title="11-4.jpg" alt="11-4.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="147px">11.5</TD><TD width="346.573px" height="147px"><P>Open the inbox of your alternative email address. You should have received an <STRONG>email</STRONG> with the verification code.</P><P><STRONG>Copy</STRONG> the code to the clipboard.</P></TD><TD width="346.583px" height="147px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-5.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329440i16182B39C5EFA581/image-size/medium?v=v2&px=400" role="button" title="11-5.jpg" alt="11-5.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="181px">11.6</TD><TD width="346.573px" height="181px"><P><STRONG>Paste</STRONG> the code in the entry field.</P><P>Click <STRONG>Next</STRONG>.</P></TD><TD width="346.583px" height="181px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-6.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329442i93367936E49B86A7/image-size/medium?v=v2&px=400" role="button" title="11-6.jpg" alt="11-6.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="241px">11.7</TD><TD width="346.573px" height="241px"><P>Enter your new (initial) password.</P><P>Click <STRONG>Finish</STRONG>.</P></TD><TD width="346.583px" height="241px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-7.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329443i533A39881F46EECF/image-size/medium?v=v2&px=400" role="button" title="11-7.jpg" alt="11-7.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="130px">11.8</TD><TD width="346.573px" height="130px"><P><STRONG>Wait</STRONG> for the password reset confirmation.</P><P>Select the <STRONG>click here</STRONG> link.</P></TD><TD width="346.583px" height="130px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-8.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329444iFE5D8BD055AB3B91/image-size/medium?v=v2&px=400" role="button" title="11-8.jpg" alt="11-8.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="263px">11.9</TD><TD width="346.573px" height="263px"><STRONG>Enter</STRONG> your username and click <STRONG>Next</STRONG>.</TD><TD width="346.583px" height="263px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-9.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329445iF113E306F921C07C/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="11-9.jpg" alt="11-9.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="264px">11.10</TD><TD width="346.573px" height="264px"><P><STRONG>Enter</STRONG> your new password.</P><P>Click <STRONG>Sign in</STRONG>.</P></TD><TD width="346.583px" height="264px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-10.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329446i7B2F196530836ED2/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="11-10.jpg" alt="11-10.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="293px">11.11</TD><TD width="346.573px" height="293px">Click <STRONG>Next</STRONG>.</TD><TD width="346.583px" height="293px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-11.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329447iB2C9DC2FC04182A3/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="11-11.jpg" alt="11-11.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="164px">11.12</TD><TD width="346.573px" height="164px">For testing purposes, click <STRONG>Skip setup</STRONG> for now.</TD><TD width="346.583px" height="164px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-12.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329448iCA79442028712950/image-size/medium?v=v2&px=400" role="button" title="11-12.jpg" alt="11-12.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="232px">11.13</TD><TD width="346.573px" height="232px"><P>The request for the SAP EPM access package is started.</P><P>Click <STRONG>Continue</STRONG>.</P></TD><TD width="346.583px" height="232px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-13.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329449iC08E8FC116EBF9ED/image-size/medium?v=v2&px=400" role="button" title="11-13.jpg" alt="11-13.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="30px">11.14</TD><TD width="346.573px" height="30px"><P>Optionally provide a business justification for the new request.</P><P>Click <STRONG>Submit request</STRONG>.</P></TD><TD width="346.583px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-14.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329450i3527B4166A8A90CF/image-size/medium?v=v2&px=400" role="button" title="11-14.jpg" alt="11-14.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="30px">11.15</TD><TD width="346.573px" height="30px"><P>In the <A href="https://entra.microsoft.com/" target="_blank" rel="noopener nofollow noreferrer">Entra admin center</A>, select <STRONG>Groups</STRONG> from the top navigation menu.</P><P>On the <STRONG>Overview</STRONG> page, enter the test group's name SAP_BC_EPM_DEMO in the <STRONG>search</STRONG> field.</P><P><STRONG>Select</STRONG> the group from the search results list.</P></TD><TD width="346.583px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-15.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329451iD5974891B82B5682/image-size/medium?v=v2&px=400" role="button" title="11-15.jpg" alt="11-15.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="30px">11.16</TD><TD width="346.573px" height="30px"><P>Select <STRONG>Members</STRONG> from the group navigation menu.</P><P>By requesting the access package and auto-approving it, Linda Larson became now a member of this group.</P></TD><TD width="346.583px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="11-16.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329452i374EA6E212A308ED/image-size/medium?v=v2&px=400" role="button" title="11-16.jpg" alt="11-16.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId--445569965">Provision the group membership to CIS</H2><P>Let's see the updated SCIM connector with support for groups in action, and provision Linda's new user account and her membership to the SAP_BC_EPM_DEMO to your CIS tenant's local directory. Since the group hasn't been created in CIS when your ran the initial load of the PFCG roles to Entra in steps 7.1 ff, the group will be provisioned as well. </P><TABLE border="1"><TBODY><TR><TD width="49.1771px" height="30px"><STRONG>Step</STRONG></TD><TD width="350px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="49.1771px" height="185px">12.1</TD><TD width="350px" height="185px"><P>Select <STRONG>Enterprise apps</STRONG> from the top navigation menu.</P><P><STRONG>Search</STRONG> for your CIS tenant's enterprise app and select if from the search results.</P></TD><TD width="350px" height="185px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329705i096B2BD17DA5DEA7/image-size/medium?v=v2&px=400" role="button" title="12-1.jpg" alt="12-1.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="300px">12.2</TD><TD width="350px" height="300px">Select <STRONG>Provisioning</STRONG> from the app's menu.</TD><TD width="350px" height="300px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329706i0B5AC7D8A17A6107/image-size/medium?v=v2&px=400" role="button" title="12-2.jpg" alt="12-2.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="240px">12.3</TD><TD width="350px" height="240px"><P>Before provisioning the group and its members to CIS, it must be assigned to the app.</P><P>Select <STRONG>Users and groups</STRONG>.</P></TD><TD width="350px" height="240px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-3.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329707iA36F2202E5DA01B1/image-size/medium?v=v2&px=400" role="button" title="12-3.jpg" alt="12-3.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="258px">12.4</TD><TD width="350px" height="258px">Click <STRONG>None Selected</STRONG>.</TD><TD width="350px" height="258px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329708i1AAA87E3D42A370C/image-size/medium?v=v2&px=400" role="button" title="12-4.jpg" alt="12-4.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="402px">12.5</TD><TD width="350px" height="402px"><P>In the <STRONG>Search</STRONG> field, enter the group's name SAP_BC_EPM_DEMO.</P><P><STRONG>Activate</STRONG> the checkbox for the group in the search results and click <STRONG>Select</STRONG>.</P></TD><TD width="350px" height="402px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-5.jpg" style="width: 287px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329709iDC8F9817AA7ECEC2/image-size/medium?v=v2&px=400" role="button" title="12-5.jpg" alt="12-5.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="348px">12.6</TD><TD width="350px" height="348px">Click <STRONG>Assign</STRONG>.</TD><TD width="350px" height="348px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-6.jpg" style="width: 393px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329710iD934BD6F17D0C06E/image-size/medium?v=v2&px=400" role="button" title="12-6.jpg" alt="12-6.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="184px">12.7</TD><TD width="350px" height="184px"><P>Select <STRONG>Provision on demand</STRONG> from the menu.</P><P>In the <STRONG>Selected group</STRONG> field, enter the group's name SAP_BC_EPM_DEMO.</P><P>Keep the default choice <STRONG>View members only</STRONG>, select the user from the members <STRONG>drop-down list</STRONG> by <STRONG>activating</STRONG> the checkbox for Linda Larson.</P><P>Click <STRONG>Provision</STRONG>.</P></TD><TD width="350px" height="184px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-7.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329711i5059B5F5638E35AA/image-size/medium?v=v2&px=400" role="button" title="12-7.jpg" alt="12-7.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="30px">12.8</TD><TD width="350px" height="30px"><P>The results of the provisioning action are shown.</P><P>On the <STRONG>Group details</STRONG> tab, you can see that the group SAP_BC_EPM_DEMO was created in your CIS tenant.</P><P>Switch to the <STRONG>Group membership operations</STRONG> tab.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-8.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329712iBFB15DB750F12BBC/image-size/medium?v=v2&px=400" role="button" title="12-8.jpg" alt="12-8.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="30px">12.9</TD><TD width="350px" height="30px"><P>Linda's membership was also added successfully to the new group in CIS.</P><P>Switch to the <STRONG>User operations</STRONG> tab.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-9.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329713i965DC0C49743CF34/image-size/medium?v=v2&px=400" role="button" title="12-9.jpg" alt="12-9.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="30px">12.10</TD><TD width="350px" height="30px"><P>A new user account for Linda was also created in the CIS tenant. </P><P>Click <STRONG>View details</STRONG>.</P></TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-10.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329714iAB91CF2E9AA11F7C/image-size/medium?v=v2&px=400" role="button" title="12-10.jpg" alt="12-10.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="30px">12.11</TD><TD width="350px" height="30px">Linda's new user account in CIS has been created with the attribute values according to the mapping configuration customized in steps 3.7 to 3.13. The last line shows the new <STRONG>sapUserName</STRONG> attribute set with Linda's on-premise user name in AD. </TD><TD width="350px" height="30px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="12-11.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329715i3E8001B0B038004C/image-size/medium?v=v2&px=400" role="button" title="12-11.jpg" alt="12-11.jpg" /></span></TD></TR></TBODY></TABLE><H2 id="toc-hId--642083470">Provision the role assignment to SAP</H2><P>Final step: Let's provision Linda's new user and her group membership in CIS to the SAP backend system. </P><TABLE border="1"><TBODY><TR><TD width="49.1771px" height="30px"><STRONG>Step</STRONG></TD><TD width="350px" height="30px"><STRONG>Description</STRONG></TD><TD width="350px" height="30px"><STRONG>Screenshot</STRONG></TD></TR><TR><TD width="49.1771px" height="356px">13.1</TD><TD width="350px" height="356px"><P>Go back to your CIS tenant's administration console.</P><P>Select <STRONG>Groups</STRONG> from the <STRONG>Users & Authorizations</STRONG> menu.</P><P>Select the newly created group SAP_BC_EPM_DEMO from the list and check that Linda's user has been added successfully as a member.</P><P>Next, select <STRONG>Source Systems</STRONG> from the <STRONG>Identity Provisioning</STRONG> menu.</P></TD><TD width="350px" height="356px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="13-1.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329773iB71C403C61DCA8F0/image-size/medium?v=v2&px=400" role="button" title="13-1.jpg" alt="13-1.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="302px">13.2</TD><TD width="350px" height="302px"><P>Select the <STRONG>LocalDirectory</STRONG> source system from the list.</P><P>Make sure that you've recreated this source system with the <A href="https://github.com/raepple/iam-with-entra/blob/0a73239a81c596811d0e704eb715045c2fdddde0/part3/LocalDirectory.json" target="_blank" rel="noopener nofollow noreferrer">new import file</A> from this tutorials GitHub repository path as mentioned in the prerequisites section.</P><P>Switch to the <STRONG>Jobs</STRONG> tab.</P><P>Click <STRONG>Run Now</STRONG>.</P></TD><TD width="350px" height="302px"><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="13-2.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329774iE770630D94B1C01E/image-size/medium?v=v2&px=400" role="button" title="13-2.jpg" alt="13-2.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="179px">13.3</TD><TD width="350px" height="179px"><P>Select <STRONG>Provisioning Logs</STRONG> from the <STRONG>Identity Provisioning</STRONG> menu.</P><P>Wait for the <STRONG>Status</STRONG> to <EM>Finish Successfully</EM> and then select the top log entry for your <STRONG>LocalDirectory</STRONG> source system.</P></TD><TD width="350px" height="179px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="13-3.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329775iAD96514EEE45C105/image-size/large?v=v2&px=999" role="button" title="13-3.jpg" alt="13-3.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="139px">13-4</TD><TD width="350px" height="139px">In the <STRONG>Statistics</STRONG> of the provisioning action you can see that a new user was created in the SAP system, and that the equally named role for the group has been updated with Linda's membership.</TD><TD width="350px" height="139px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="13-4.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329776i0FFB03122943C668/image-size/medium?v=v2&px=400" role="button" title="13-4.jpg" alt="13-4.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="358px">13.5</TD><TD width="350px" height="358px"><P>Check the new role assignment in the SAP system and Linda's correct SNC mapping for Kerberos-based SSO by <STRONG>logging</STRONG> into the domain-joined workstation.</P><P>To login, use the <STRONG>password</STRONG> that you've (re)set in step 11.7 and that has been written back to AD.</P></TD><TD width="350px" height="358px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="13-5.jpg" style="width: 382px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329777iDDBBEFE38C7E7B6E/image-size/medium/is-moderation-mode/true?v=v2&px=400" role="button" title="13-5.jpg" alt="13-5.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="227px">13.6</TD><TD width="350px" height="227px"><P>Start SAP GUI.</P><P>You may need to add the connection to the SAP backend as described in step 10.29 and 10.30 in <A href="https://community.sap.com/t5/technology-blog-posts-by-members/identity-and-access-management-with-microsoft-entra-part-ii-provisioning-to/ba-p/13990927" target="_blank">part II</A>.</P><P><STRONG>Right-click</STRONG> on the connection and select <STRONG>SNC Login with Single Sign-On</STRONG>. </P></TD><TD width="350px" height="227px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="13-6.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329778iF55C4EA712D44840/image-size/medium?v=v2&px=400" role="button" title="13-6.jpg" alt="13-6.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="196px">13.7</TD><TD width="350px" height="196px"><P>Because this is the first login for the new user you are prompted to either reset the initial password, or deactivate it.</P><P>Click on<SPAN> </SPAN><STRONG>Delete</STRONG><SPAN> </SPAN>to use SNC and Kerberos-based SSO. </P></TD><TD width="350px" height="196px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="13-7.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329779iC55520BE054A544A/image-size/medium?v=v2&px=400" role="button" title="13-7.jpg" alt="13-7.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="248px">13.8</TD><TD width="350px" height="248px"><SPAN>You are single signed-on to the SAP system using SNC and Kerberos SSO, and Linda's user menu shows the entries for the <STRONG>EPM Demo Applications</STRONG> as a result of the successful assignment to the SAP_BC_EPM_DEMO role.</SPAN></TD><TD width="350px" height="248px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="13-8.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329780iB0D42DB422D73CBA/image-size/medium?v=v2&px=400" role="button" title="13-8.jpg" alt="13-8.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="172px">13.9</TD><TD width="350px" height="172px"><P>As an administrator in the SAP system, start transaction <STRONG>PFCG</STRONG>.</P><P>In the <STRONG>Role</STRONG> field, enter SAP_BC_EPM_DEMO.</P><P>Click <STRONG>Display</STRONG>.</P></TD><TD width="350px" height="172px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="13-9.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329781iBD7D9D704465F547/image-size/medium?v=v2&px=400" role="button" title="13-9.jpg" alt="13-9.jpg" /></span></TD></TR><TR><TD width="49.1771px" height="218px">13.10</TD><TD width="350px" height="218px"><P>Swith to the <STRONG>User</STRONG> tab.</P><P>You can see Linda's SAP user account LLARSON assinged to the role.</P></TD><TD width="350px" height="218px"><span class="lia-inline-image-display-wrapper lia-image-align-left" image-alt="13-10.jpg" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/329782iA2789539EF6C50FF/image-size/medium?v=v2&px=400" role="button" title="13-10.jpg" alt="13-10.jpg" /></span></TD></TR></TBODY></TABLE><P><STRONG>Done</STRONG>! Once again, thank you for following this tutorial and the blog series, and looking forward to your comments & feedback.</P>2025-10-20T10:05:47.788000+02:00https://community.sap.com/t5/technology-blog-posts-by-members/sap-cloud-connector-subaccount-certificate-automated-renewal-has-arrived/ba-p/14305218SAP Cloud Connector Subaccount Certificate Automated Renewal has arrived!!2026-01-11T23:00:00.036000+01:00pjcoolshttps://community.sap.com/t5/user/viewprofilepage/user-id/944<P>I wrote a Blog post some time ago (back in 2020!) in the #SAPCommunity about SAP BTP Cloud Connectivity issues due to expired certificates. The BTP Subaccount certificates needed to be regularly renewed - every 12 months in fact and it could only be carried out manually. While SAP provided information to customers about upcoming renewals (in later releases of the SAP Cloud Connector) with messages and Alerts within the SAP Cloud Connector - certificates that expired caused no end of trouble. This still causes a lot of issues for customers today. </P><P>The previous blog post has reached over 60K views so you can see a fair number of customers experienced this issue. <A href="https://community.sap.com/t5/technology-blog-posts-by-members/sap-cloud-connectivity-issues-due-to-expired-certificate/ba-p/13431648" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-members/sap-cloud-connectivity-issues-due-to-expired-certificate/ba-p/13431648</A></P><P>The goods news is - SAP released an update to the SAP Cloud Connector application to automate these renewals. Yes - you have read this correctly! The update 2.18.0 was released in March 2025 and I only recently found out that this was possible. So if you have a previous version of the SAP Cloud Connector running then schedule an upgrade ASAP. I also wrote instructions for upgrading the Cloud Connector for Linux and Windows here -> <A href="https://community.sap.com/t5/technology-blog-posts-by-members/upgrading-the-sap-cloud-connector-for-linux-os/ba-p/13338502" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-members/upgrading-the-sap-cloud-connector-for-linux-os/ba-p/13338502</A> and <A href="https://community.sap.com/t5/technology-blog-posts-by-members/upgrading-the-sap-cloud-connector-for-windows-os/ba-p/13314729" target="_blank">https://community.sap.com/t5/technology-blog-posts-by-members/upgrading-the-sap-cloud-connector-for-windows-os/ba-p/13314729</A></P><P>To automate the Subaccount certificate renewal process multiple steps are required. This involves the SAP Cloud Connector as well as the relevant BTP subaccount. <A href="https://me.sap.com/notes/0003632133" target="_self" rel="noopener noreferrer">SAP note 3632133</A> covers the steps required to automate the Subaccount certificate renewal but I will cover this now. Here are the steps to automate renewal of Subaccount certificates so you don't have to worry about this again! </P><OL><LI><STRONG>To enable automatic renewal in the SAP Cloud Connector. <BR /></STRONG>Make sure when setting up Subaccount connectivity within the SAP Cloud Connector to toggle the [Auto Renewal] and set to ON. For subaccounts that are already set up just Edit the connection. </LI></OL><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SCC auto renewal option_.png" style="width: 515px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360129i8FE8B5C9A59D418B/image-dimensions/515x317/is-moderation-mode/true?v=v2" width="515" height="317" role="button" title="SCC auto renewal option_.png" alt="SCC auto renewal option_.png" /></span></P><P>2. <STRONG>To enable Auto Renewal in SAP BTP Cockpit:<BR /><BR /></STRONG></P><OL><LI>Log in to the SAP BTP Cockpit;</LI><LI>Go to the respective Subaccount ><SPAN> </SPAN><STRONG>Connectivity</STRONG><SPAN> </SPAN>> "<STRONG>Cloud Connectors</STRONG>";</LI><LI>Enable the "<STRONG>Allow Automatic Subaccount Certificate Refresh</STRONG>" toggle.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="cert renewal - BTP subaccount.png" style="width: 681px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/360235i626358A26D9F09D5/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="cert renewal - BTP subaccount.png" alt="cert renewal - BTP subaccount.png" /></span><BR /><DIV class=""> </DIV><BR />As per the note, this is how the renewal works. <BR /><DIV class=""> </DIV><P><STRONG><SPAN>How Renewal Works</SPAN><BR /></STRONG></P><UL><LI>The renewal is triggered n + 7 days before certificate expiry, where n is the alert threshold (configurable in Observation Configuration -><SPAN> </SPAN><A class="" href="https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/alerting" target="_blank" rel="noopener noreferrer">Alerting</A>);</LI><LI>If the renewal attempt fails, it is retried every 12 hours; If not successful within 7 days, the automatic renewal is cancelled.</LI><LI>No user credentials are involved in the automatic renewal of a BTP subaccount certificate. The authentication is handled by the currently valid subaccount certificate, provided that an administrator has enabled the auto-renewal feature for the subaccount on the BTP side too.</LI></UL></LI></OL><P>So, if the above instructions are followed you should not experience issues with Cloud connectivity again! </P><P>The other good news is that this was submitted as an improvement request via the Customer influence engagement portal. In retrospect I wrote a blog post about it but did not submit a customer engagement initiative request to make an improvement but good to see others did. 54 others also voted for it. 5 years is also too long for this to be delivered given the amount of issues this caused for a lot of the customers I work with on a daily basis but glad that SAP has delivered this now. </P><P><A href="https://influence.sap.com/sap/ino/#/idea/251489/?section=sectionDetails" target="_blank" rel="noopener noreferrer">https://influence.sap.com/sap/ino/#/idea/251489/?section=sectionDetails</A></P><P>Overall, I am really happy that SAP has delivered this functionality and I really hope customers plan to do upgrades to the SAP Cloud Connector to take advantage of this update ASAP. </P><P>As always, thanks for reading and hopefully this helps! </P>2026-01-11T23:00:00.036000+01:00https://community.sap.com/t5/porto-blog-posts/5th-sibs-partners-meeting-innovation-with-connectivity-sibs-with-sap/ba-p/143148125th SIBS Partners Meeting: Innovation with connectivity: SIBS with SAP2026-01-26T14:50:18.361000+01:00MRobalinhohttps://community.sap.com/t5/user/viewprofilepage/user-id/140615<P>Last <STRONG>Thursday</STRONG>, I had the pleasure of participating, in the <STRONG>5th SIBS Partners Meeting</STRONG>, held at <STRONG>Quinta da Atela, in Alpiarça</STRONG>. Once again, the event proved to be a key moment for knowledge sharing, strategic alignment, and strengthening the partner ecosystem around SIBS and its technologies.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Sem título.jpg" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/365241iDB040CC6FA68AFC5/image-size/large/is-moderation-mode/true?v=v2&px=999" role="button" title="Sem título.jpg" alt="Sem título.jpg" /></span></P><P>This fifth edition reinforced the focus on <STRONG>collaboration, technological innovation and future vision</STRONG>, while also bringing new and highly relevant topics to the forefront — particularly the real impact of <STRONG>Artificial Intelligence (AI)</STRONG> on partner products, business models and go-to-market strategies.</P><H3 id="toc-hId-1917746725">Two panels, one shared goal: creating value</H3><P>The event featured <STRONG>two discussion panels</STRONG>, both offering strong practical and strategic insights.</P><P>The <STRONG>first panel</STRONG> focused on the relationship between <STRONG>SIBS and its partners</STRONG>, addressing:</P><UL><LI><P>Different interaction models with SIBS</P></LI><LI><P>Real examples of products and solutions built on <STRONG>SIBS technologies</STRONG></P></LI><LI><P>Technical, operational and integration challenges in real market contexts</P></LI></UL><P>This discussion clearly highlighted the maturity of the partner ecosystem and the importance of a collaborative approach to accelerate innovation while ensuring secure, scalable and reliable solutions.</P><P>The <STRONG>second panel</STRONG> was dedicated to <STRONG>Artificial Intelligence in partner products</STRONG>, fostering an open and pragmatic discussion around:</P><UL><LI><P><STRONG>Security challenges</STRONG> related to the adoption of AI</P></LI><LI><P>The impact of AI on <STRONG>product value propositions</STRONG></P></LI><LI><P><STRONG>Commercial challenges and opportunities</STRONG>, including how AI can drive differentiation, sales growth and new business models</P></LI></UL><P>It became evident that AI is no longer just a technological topic, but a <STRONG>strategic business driver</STRONG>, requiring the right balance between innovation, trust, compliance and commercial viability.</P><H3 id="toc-hId-1721233220">Recognition for SAP–SIBS interface award</H3><P>For me, one of the most significant moments of the event was the recognition given to Makevalue, which I represented, that received an <STRONG>award for the SAP–SIBS interface</STRONG> developed throughout 2025. I participated in this project in 2025, and it was a game-changer in terms of knowledge sharing and a comprehensive approach to product development: purpose, security, technology, sales, and marketing.</P><P>This project was a key enabler for the <STRONG>official certification of SAP/SIBS connectivity by SIBS</STRONG>, representing an important milestone in the integration between SAP systems and the SIBS payments and services ecosystem.</P><P>The solution was developed within the scope of a <STRONG>SIBS LABS project</STRONG>, further underlining its innovative nature and the strong collaboration between the technical and functional teams involved.</P><P>This recognition reinforces Makevalue’s commitment to:</P><UL><LI><P>Deliver <STRONG>robust, certified and enterprise-grade solutions</STRONG></P></LI><LI><P>Enable seamless <STRONG>integration between core business platforms such as SAP and critical market infrastructures</STRONG></P></LI><LI><P>Actively contribute to the evolution of the national and international technology ecosystem</P></LI></UL><H3 id="toc-hId-1524719715">Conclusion</H3><P>The <STRONG>5th SIBS Partners Meeting</STRONG> once again confirmed that the future is built on <STRONG>strong partnerships, continuous innovation and the responsible adoption of emerging technologies</STRONG>, particularly Artificial Intelligence. For the partners, this event was a moment of pride, exchange and strategic alignment, reinforcing our role as a trusted technology partner in complex integration and innovation projects</P><P>We remain fully committed to creating value, now strengthened by a recognition that reflects consistent work, close collaboration and a long-term vision.</P>2026-01-26T14:50:18.361000+01:00