Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
qmacro
Developer Advocate
Developer Advocate
Use a simple example to kick the tyres of the new User API Service available in the @Sap/approuter NPM package.

In the SAP Developer News episode for calendar week 04, there was an item covering updates to some NPM packages, including @sap/approuter - which now has a User API Service. If you're interested in kicking the tyres of this new User API and getting a simple example up and running, this quick post is for you (there's a link to files in our GitHub repo at the end).

The simplest thing that could possibly work is an @Sap/approuter based app with a minimal configuration as described in the User API Service section. That app needs to be bound to a minimally configured instance of the Authorization & Trust Management service (aka "xsuaa") and running in Cloud Foundry (CF).

App with minimal configuration


While the app is still effectively a Node.js package, there is no code, just configuration. First, in the form of the Node.js package.json file, which looks like this:
{
"name": "userapitest",
"scripts": {
"start": "node node_modules/@sap/approuter/approuter.js"
},
"dependencies": {
"@sap/approuter": "^9.1.0"
}
}

The built-in approuter.js script is run directly when the app is started. It will look for configuration and find it in an xs-app.json file, the contents of which should look like this:
{
"welcomeFile": "/user-api/attributes",
"routes": [
{
"source": "^/user-api(.*)",
"target": "$1",
"service": "sap-approuter-userapi"
}
]
}

Note that the welcomeFile property is used to automatically redirect us to one of the two endpoints supported by the User API Service - the "attributes" endpoint. The rest of the configuration is taken directly from the documentation.

The xsuaa instance needs some minimal configuration - an app name and the tenant mode in which it is to run. Here it is, in an xs-security.json file:
{
"xsappname": "userapitest",
"tenant-mode": "dedicated"
}

We can use a simple manifest for the CF command "cf push", to save on typing. This defines what we need (although it doesn't cause the creation of the xsuaa service instance, like an MTA based approach would, but we're keeping things as simple as possible here). The contents of that manifest - in the manifest.yml file, are as follows:
applications:
- name: userapitest
disk_quota: 256M
instances: 1
memory: 256M
random-route: true
services:
- xsuaa-application
stack: cflinuxfs3

Setting things up


So all we need to do now is to create the xsuaa service instance, with the "application" plan & those xs-security.json settings, specifying the name "xsuaa-application" (as that's what is expected via the entry in the manifest), and then run the "cf push".

Let's take those steps now. First, the service instance creation:
; cf create-service xsuaa application xsuaa-application -c xs-security.json 
Creating service instance xsuaa-application in org xde3af75trial / space dev as sapdeveloper@example.com...
OK

Now the xsuaa service instance exists, we can create & deploy the app and have it bound to that service instance:
; cf push -f manifest.yml
Pushing from manifest to org xde3af75trial / space dev as sapdeveloper@example.com...
Using manifest file /Users/sapdeveloper/Projects/userapitest/manifest.yml
Getting app info...
Creating app with these attributes...
+ name: userapitest
path: /Users/i347491/Projects/userapitest
+ disk quota: 256M
+ instances: 1
+ memory: 256M
+ stack: cflinuxfs3
services:
+ xsuaa-application
routes:
+ userapitest-grouchy-chimpanzee-nx.cfapps.eu10.hana.ondemand.com
[...]
Waiting for app to start...
[...]
state since cpu memory disk details
#0 running 2021-02-19T17:55:10Z 0.0% 35.6K of 256M 8K of 256M
;

And that's it!

Checking the results


Accessing the route given in the output (the "userapitest-grouchy-chimpanzee.nz" route, here) in the browser results in this output, generated directly by the User API Service for the /user-api/attributes path:
{
firstname: "SAP",
lastname: "Developer",
email: "sapdeveloper@example.com",
name: "sapdeveloper@example.com",
}

And the output for the /user-api/currentUser path looks like this:
{
firstname: "SAP",
lastname: "Developer",
email: "sapdeveloper@example.com",
name: "sapdeveloper@example.com",
displayName: "SAP Developer (sapdeveloper@example.com)",
}

Trying it yourself


There's a branch for this SAP Tech Bytes post in the accompanying SAP Tech Bytes repository: Check it out and follow the simple instructions here:

https://github.com/SAP-samples/sap-tech-bytes/tree/2021-02-20-approuter-user-api-service

 




SAP Tech Bytes is an initiative to bring you bite-sized information on all manner of topics, in video and written format. Enjoy!
12 Comments