diff --git a/package-lock.json b/package-lock.json index 58813e5..8657115 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@cap-js-community/odata-v2-adapter": "^1.11.12", + "@sap-cloud-sdk/http-client": "^3.9.0", "@sap-cloud-sdk/resilience": "^3.9.0", "@sap/audit-logging": "^5.8.2", "@sap/cds": "^7.5.0", @@ -487,6 +488,107 @@ "axios": "^0.26.0" } }, + "node_modules/@sap-cloud-sdk/connectivity": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/connectivity/-/connectivity-3.9.0.tgz", + "integrity": "sha512-K9LN54iIKaiD7Zpb6PGsjbbWlAmJvYjX/r//YpxEV7Q0UM9p+e54BbZg/OouLMI9IhppcuWRKRxEKVvcVyhflg==", + "dependencies": { + "@sap-cloud-sdk/resilience": "^3.9.0", + "@sap-cloud-sdk/util": "^3.9.0", + "@sap/xsenv": "^4.2.0", + "@sap/xssec": "^3.6.0", + "async-retry": "^1.3.3", + "axios": "^1.6.2", + "jsonwebtoken": "^9.0.2" + } + }, + "node_modules/@sap-cloud-sdk/connectivity/node_modules/@sap-cloud-sdk/util": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/util/-/util-3.9.0.tgz", + "integrity": "sha512-YTmKbobEeZNL0rhl7TM6VvaP1OxFk5/hJLehClxFTwBR1QulD4h+96FFWMqRdQzSuiGA9aBEq4PcatUpMgbvpg==", + "dependencies": { + "axios": "^1.6.2", + "chalk": "^4.1.0", + "logform": "^2.6.0", + "voca": "^1.4.1", + "winston": "^3.11.0", + "winston-transport": "^4.6.0" + } + }, + "node_modules/@sap-cloud-sdk/connectivity/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@sap-cloud-sdk/connectivity/node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@sap-cloud-sdk/connectivity/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@sap-cloud-sdk/connectivity/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@sap-cloud-sdk/connectivity/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@sap-cloud-sdk/connectivity/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sap-cloud-sdk/connectivity/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@sap-cloud-sdk/core": { "version": "1.54.2", "license": "Apache-2.0", @@ -576,6 +678,104 @@ "npm": ">=1.4.28" } }, + "node_modules/@sap-cloud-sdk/http-client": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/http-client/-/http-client-3.9.0.tgz", + "integrity": "sha512-BAZNnWClVxjbQnkRpOPpTrGCVLjlSIEjiTz+7QWIEB09YJ1tZaJ5ad1N75vRpI09pfRu3925pTVCI9Wzw85g0Q==", + "dependencies": { + "@sap-cloud-sdk/connectivity": "^3.9.0", + "@sap-cloud-sdk/resilience": "^3.9.0", + "@sap-cloud-sdk/util": "^3.9.0", + "axios": "^1.6.2" + } + }, + "node_modules/@sap-cloud-sdk/http-client/node_modules/@sap-cloud-sdk/util": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/util/-/util-3.9.0.tgz", + "integrity": "sha512-YTmKbobEeZNL0rhl7TM6VvaP1OxFk5/hJLehClxFTwBR1QulD4h+96FFWMqRdQzSuiGA9aBEq4PcatUpMgbvpg==", + "dependencies": { + "axios": "^1.6.2", + "chalk": "^4.1.0", + "logform": "^2.6.0", + "voca": "^1.4.1", + "winston": "^3.11.0", + "winston-transport": "^4.6.0" + } + }, + "node_modules/@sap-cloud-sdk/http-client/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@sap-cloud-sdk/http-client/node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@sap-cloud-sdk/http-client/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@sap-cloud-sdk/http-client/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@sap-cloud-sdk/http-client/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@sap-cloud-sdk/http-client/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sap-cloud-sdk/http-client/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@sap-cloud-sdk/resilience": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/@sap-cloud-sdk/resilience/-/resilience-3.9.0.tgz", diff --git a/package.json b/package.json index 5d490b7..1cae1e3 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ ], "dependencies": { "@cap-js-community/odata-v2-adapter": "^1.11.12", + "@sap-cloud-sdk/http-client": "^3.9.0", "@sap-cloud-sdk/resilience": "^3.9.0", "@sap/audit-logging": "^5.8.2", "@sap/cds": "^7.5.0", @@ -52,6 +53,11 @@ "cov2ap": { "plugin": true }, + "log": { + "levels": { + "catalog-service": "debug" + } + }, "requires": { "db": { "kind": "sqlite", diff --git a/srv/catalog-service.cds b/srv/catalog-service.cds index 4051737..2d593ad 100644 --- a/srv/catalog-service.cds +++ b/srv/catalog-service.cds @@ -8,5 +8,6 @@ service CatalogService @(requires: 'authenticated-user') { @readonly entity Products as projection on external.SEPMRA_C_PD_Product; - action readSAPLogonTicket() returns String; + action getOAuth2SAMLBearerAssertion() returns String; + action readSAPLogonTicket() returns String; } diff --git a/srv/catalog-service.js b/srv/catalog-service.js index c454884..e4b352b 100644 --- a/srv/catalog-service.js +++ b/srv/catalog-service.js @@ -1,11 +1,27 @@ +const cds = require("@sap/cds"); +const LOG = cds.log("catalog-service"); + +function getAuthToken(req) { + const authHeader = req._.req.headers["authorization"]; + const token = authHeader.substring(7); + return token; +} + module.exports = async function (srv) { const biscuitService = await cds.connect.to("biscuit"); const productService = await cds.connect.to("SEPMRA_PROD_MAN"); srv.on("READ", "Products", async (req) => { + const token = getAuthToken(req); + LOG.debug("Token: " + token); return productService.run(req.query); }); + srv.on("getOAuth2SAMLBearerAssertion", async (req) => { + const token = getAuthToken(req); + LOG.debug("Token: " + token); + }); + srv.on("readSAPLogonTicket", async (req) => { // const biscuitServiceTransaction = biscuitService.transaction(req) // Results in: diff --git a/test/catalog.http b/test/catalog.http index 776648e..b46c0fa 100644 --- a/test/catalog.http +++ b/test/catalog.http @@ -9,7 +9,15 @@ GET http://localhost:6420/odata/v4/catalog/Books Authorization: Bearer {{$dotenv token}} ### Read Books as Authenticated User GET http://localhost:6420/odata/v4/catalog/Products + ?$filter=IsActiveEntity eq true + &$top=10 Authorization: Bearer {{$dotenv token}} +### +POST http://localhost:6420/odata/v4/catalog/getOAuth2SAMLBearerAssertion +Authorization: Bearer {{$dotenv token}} +Content-Type: application/json + +{} ### Read SAP Logon Ticket # @name readSAPLogonTicket POST http://localhost:6420/odata/v4/catalog/readSAPLogonTicket