Authorization in Node-Red
Hi all, I'm trying to build some automations for reporting through Node-Red using the SKY API. I'm having a difficult time understanding how to authenticate through this and am wondering if anyone has any experience with this they might be able to share, particularly how to generate an authentication token and begin making API calls. I am able to do this in Postman via one-off testing, but can't figure it out in Node-Red.
Comments
-
Hi Rainer,
I created some flows this weekend to show how to authorize and make an API call with Node-Red.
You will need several values:
1. Your SKY API Subscription ID (Primary access key)
2. The client ID of your SKY Application
3. The client secret of your SKY Application
4. You will need to create a valid refresh token with Postman or another API tool.I created a JSON file locally to store the configuration values needed to authorize and make API requests. I used the path 'd:\\oauth\\token.txt' but you can store the file where you want and change the paths where the file is READ and WRITTEN to.


The configuration file should look like this, except you will need to replace the {tokens} with the correct values.
{
"grant_type": "refresh_token",
"refresh_token": "{valid-refresh-token}",
"subscription_id": "{your-subscription-id}",
"client_id": "{your-client-id}",
"client_secret": "{your-client-secret}"
}
The flow will use a subflow to read the token file and then use those values to attempt a Constituent List API call. If the call fails with a HTTP 401 Unauthorized, it will use a subflow to refresh token data and attempt the call again.
The refresh token subflow is where you will find how to make a call to get an access token and a new refresh token.

I hope this helps! Good luck on your project!
0 -
Here is the export of the flows
[{"id":"181d7cfca17e0bfb","type":"subflow","name":"Refresh Token","info":"","category":"","in":[{"x":40,"y":140,"wires":[{"id":"37f2b11ae33a743c"}]}],"out":[{"x":1000,"y":180,"wires":[{"id":"de3e18c4ede4d340","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"b11e447f5f2a21be","type":"http request","z":"181d7cfca17e0bfb","name":"Token Request","method":"POST","ret":"obj","paytoqs":"body","url":"https://oauth2.sky.blackbaud.com/token","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":460,"y":180,"wires":[["a65f17a72e0094af"]]},{"id":"0a24218760d9b123","type":"function","z":"181d7cfca17e0bfb","name":"Token Request Input","func":"var formBody = [];\\n\\nfor (var property in msg.payload) {\\n var encodedKey = encodeURIComponent(property);\\n var encodedValue = encodeURIComponent(msg.payload[property]);\\n formBody.push(encodedKey + \\"=\\" + encodedValue);\\n}\\nmsg.payload = formBody.join(\\"&\\");\\nmsg.headers = {};\\nmsg.headers[\\"contnet-type\\"] = \\"application/x-www-form-urlencoded\\";\\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":440,"y":120,"wires":[["b11e447f5f2a21be"]]},{"id":"de3e18c4ede4d340","type":"file","z":"181d7cfca17e0bfb","name":"Write Token File","filename":"D:\\\\oauth\\\\token.txt","appendNewline":false,"createDir":false,"overwriteFile":"true","encoding":"none","x":740,"y":180,"wires":[["a62c1e8637c819f0"]]},{"id":"a62c1e8637c819f0","type":"debug","z":"181d7cfca17e0bfb","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1050,"y":240,"wires":[]},{"id":"a65f17a72e0094af","type":"function","z":"181d7cfca17e0bfb","name":"Get Global Token Request","func":"var token_request = global.get(\\"token_request\\");\\ntoken_request.refresh_token = msg.payload.refresh_token;\\ntoken_request.access_token = msg.payload.access_token;\\nmsg.payload = token_request;\\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":760,"y":120,"wires":[["de3e18c4ede4d340"]]},{"id":"37f2b11ae33a743c","type":"subflow:434e67626ed4b9e7","z":"181d7cfca17e0bfb","name":"","x":200,"y":140,"wires":[["0a24218760d9b123"]]},{"id":"434e67626ed4b9e7","type":"subflow","name":"Read Token File","info":"","category":"","in":[{"x":80,"y":140,"wires":[{"id":"09a15a022f4f22c9"}]}],"out":[{"x":500,"y":340,"wires":[{"id":"d7743ece37313e41","port":0}]}],"env":[],"meta":{},"color":"#DDAA99"},{"id":"09a15a022f4f22c9","type":"file in","z":"434e67626ed4b9e7","name":"Read Token Request File","filename":"d:\\\\oauth\\\\token.txt","format":"utf8","chunk":false,"sendError":false,"encoding":"none","allProps":false,"x":290,"y":140,"wires":[["5389282abf0bc48a"]]},{"id":"5389282abf0bc48a","type":"json","z":"434e67626ed4b9e7","name":"Request","property":"payload","action":"obj","pretty":false,"x":300,"y":240,"wires":[["d7743ece37313e41"]]},{"id":"d7743ece37313e41","type":"function","z":"434e67626ed4b9e7","name":"Set Token Request Variable","func":"global.set(\\"token_request\\", msg.payload);\\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":300,"y":340,"wires":[[]]},{"id":"bb809836.cac238","type":"tab","label":"Constituent List","disabled":false,"info":""},{"id":"a5eb5876edef9083","type":"function","z":"bb809836.cac238","name":"Constituent List Headers","func":"msg.headers = {};\\nmsg.headers[\\"Bb-Api-Subscription-Key\\"] = msg.payload.subscription_id;\\nmsg.headers[\\"Authorization\\"] = \\"Bearer \\" + msg.payload.access_token;\\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":490,"y":280,"wires":[["b522d02cd6adde3d"]]},{"id":"b522d02cd6adde3d","type":"http request","z":"bb809836.cac238","name":"Constituent List Request","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://api.sky.blackbaud.com/constituent/v1/constituents","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":730,"y":280,"wires":[["13c7c914deb17892","abafc78a5d2e2012"]]},{"id":"e2a4b1560e3a1e1e","type":"inject","z":"bb809836.cac238","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":100,"y":280,"wires":[["4db6724b19edfb67"]]},{"id":"4db6724b19edfb67","type":"subflow:434e67626ed4b9e7","z":"bb809836.cac238","name":"","x":280,"y":280,"wires":[["a5eb5876edef9083"]]},{"id":"13c7c914deb17892","type":"debug","z":"bb809836.cac238","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":950,"y":280,"wires":[]},{"id":"abafc78a5d2e2012","type":"switch","z":"bb809836.cac238","name":"Should Refresh","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"401","vt":"num"}],"checkall":"true","repair":false,"outputs":1,"x":720,"y":180,"wires":[["63f2bcb8530a0c1f"]]},{"id":"63f2bcb8530a0c1f","type":"subflow:181d7cfca17e0bfb","z":"bb809836.cac238","name":"","x":720,"y":80,"wires":[["4db6724b19edfb67"]]}]
0
Categories
- All Categories
- New Impact Edge Community TEST
- New YourCause Community TEST
- New SKY Community TEST
- New Grantmaking TEST Community
- New Altru Test Community
- New bbcon Community - TEST
- 12 Blackbaud Agents for Good™
- New Raiser's Edge NXT Community
- 8 Blackbaud Community Help
- 221 bbcon®
- 1.4K Blackbaud Altru®
- 410 Blackbaud Award Management™ and Blackbaud Stewardship Management™
- 1.2K Blackbaud CRM™ and Blackbaud Internet Solutions™
- 16 donorCentrics®
- 361 Blackbaud eTapestry®
- 2.7K Blackbaud Financial Edge NXT®
- 686 Blackbaud Grantmaking™
- 603 Blackbaud Education Management Solutions for Higher Education
- 3.3K Blackbaud Education Management Solutions for K-12 Schools
- 954 Blackbaud Luminate Online® and Blackbaud TeamRaiser®
- 85 JustGiving® from Blackbaud®
- 7K Blackbaud Raiser's Edge NXT®
- 4K SKY Developer
- 257 ResearchPoint™
- 123 Blackbaud Tuition Management™
- 165 Organizational Best Practices
- 247 Member Lounge (Just for Fun)
- 40 Blackbaud Community Challenges
- 37 PowerUp Challenges
- 3 (Closed) PowerUp Challenge: Grid View Batch
- 3 (Closed) PowerUp Challenge: Chat for Blackbaud AI
- 3 (Closed) PowerUp Challenge: Data Health
- 3 (Closed) Raiser's Edge NXT PowerUp Challenge: Product Update Briefing
- 3 (Closed) Raiser's Edge NXT PowerUp Challenge: Standard Reports+
- 3 (Closed) Raiser's Edge NXT PowerUp Challenge: Email Marketing
- 3 (Closed) Raiser's Edge NXT PowerUp Challenge: Gift Management
- 4 (Closed) Raiser's Edge NXT PowerUp Challenge: Event Management
- 3 (Closed) Raiser's Edge NXT PowerUp Challenge: Home Page
- 4 (Closed) Raiser's Edge NXT PowerUp Challenge: Standard Reports
- 4 (Closed) Raiser's Edge NXT PowerUp Challenge: Query
- 829 Community News
- 3.1K Jobs Board
- 57 Blackbaud SKY® Reporting Announcements
- 47 Blackbaud CRM Higher Ed Product Advisory Group (HE PAG)
- 19 Blackbaud CRM Product Advisory Group (BBCRM PAG)
