ExpressJS middleware za ograničavanje ponovljenih zahtjeva na API-je

Jedna od najvažnijih komponenti svakog API-ja, osim mogućnosti upravljanja podacima, je sigurnost. A jedna od osnovnih komponenti te sigurnosti je mogućnost blokiranja prekomjernih upita koji se šalju na pojedini API endpoint.

U ovom ću slučaju za tu svrhu koristiti Express Rate Limit modul.

Postavljanje projekta

Kreiram mapu naziva ExpressRateLimit i unutar nje pokrećem naredbu:

Odmah nakon toga instaliram Express.js i Express Rate Limit pakete:

Sada u mapi projekta mogu vidjeti datoteku package.json koja je osnova ovog projekta.

Sada imam sve potrebno za kreiranje API-ja.

Kreiranje API-ja

Kreiram index.js datoteku unutar koje kopiram sljedeći sadržaj:

API mogu testirati na putanji http://localhost:8080/api/

ExpressJS Rate Limit – zaštita API-ja

Sada, nakon što sam se uvjerio da API ispravno radi, mogu implementirati Express Rate Limit modul.

Express Rate Limit modul

Kreiram dvije krajnje točke (endpoint):

Njima pristupam putem URL-ova:

http://localhost:8080/api/putanja1 i http://localhost:8080/api/putanja2

ExpressJS Rate Limit – zaštita API-ja

Prije nego ubacim sigurnosnu zaštitu URL-ovima je moguće pristupiti neograničeno mnogo puta. Ovo nije problem kada, kao u ovom konkretnom slučaju, šaljem mali json objekt, ali kada je u pitanju API koji dohvaća više podataka iz npr. SQL baze onda to već postaje problem jer može doći do zagušenja ili potpunog blokiranja servera.

Sada ću dodati apiLimiter objekt s nekoliko parametara.

Ako želim da se ta pravila primjene na sve krajnje točke (endpoint) dodajem sljedeće:

Mogu vidjeti da je svaki sljedeći upit sporiji od prethodnog i da se nakon 5 poslanih upita prikazuje poruka iz apiLimiter objekta.

ExpressJS Rate Limit – zaštita API-ja

U slučaju da za svaku krajnju točku tj. svaki endpoint želim postaviti drugačiji uvijet to radim tako da kreiram toliki broj objekata koliko ima krajnjih čvorova. Npr.

Nodemailer & NodeJS – API za slanje emaila

Cilj ovog blog posta je pokazati kako napraviti API za slanje emaila. To ću postići koristeći NodeJS, ExpressJS, Nodemailer i naravno Gmail.

Postavljanje projekta

Kreiram mapu za projekt i unutar nje pokrećem naredbu

i odmah nakon toga instaliram potrebne NPM pakete:

Express.js: $ npm install express --save
Nodemailer: $ npm install nodemailer--save
bodyParser: $ npm install body-parser -save

Struktura projekta prema package.json sada izgleda ovako:

Sada imam sve spremno za kreiranje datoteke unutar koje će se nalaziti logika API-ja.

API sada mogu i pokrenuti te se uvjeriti da radi. Pokrećem ga naredbom u kojoj riječ “index” označava naziv .js datoteke.

Nodemailer & NodeJS – API za slanje emaila

To je mogla biti i npr. server.js datoteka. U tom bi slučaju API pokrenuo naredbom $ node server.

Na adresi http://localhost:8080/api mogu vidjeti da je API uspješno pokrenut.

Nodemailer & NodeJS – API za slanje emaila

Slanje testnog e-maila

Unutar datoteke index.js sada ću kreirati API za slanje e-maila.

S obzirom na parametar secureConnection: false vrlo je važno da omogućim dopuštanje nesigurnijim aplikacijama da pristupe računu na adresi https://myaccount.google.com/security?pli=1

“Less Secure Apps” - Google

Jer ako to ne napravim dobit ću poruku o grešci što znači da e-mail neće biti poslan/primljen. Ovaj dio mi je zadavao najviše problema prije dvije godine kada sam prvi put radio Nodemailer API. U pitanju je bila funkcionalnost vezana uz resetiranje lozinke.

Nodemailer & NodeJS – API za slanje emaila

Ako sada putem Postmana pokrenem POST zahtjev na adresu http://localhost:8080/api/posaljiEmail vrlo brzo će mi stići e-mail.

Nodemailer & NodeJS – API za slanje emaila

Zašto se u slici iznad kao adresa primatelja nalazi drugačija adresa od one navedene gore u API-ju? To je zbog postavki unutar Gmaila gdje je navedeno da je adresa k*n*a*t@tomislavstankovic.com zadana adresa pošiljatelja. S obzirom da ovdje koristim Gmail kao servis za slanje e-maila jasno je da će on uzeti te zadane postavke.

Nodemailer & NodeJS – API za slanje emaila

E-mail sa “pravim” podacima

U gornjem sam se primjeru uvjerio da moj Nodemailer API uredno radi, a sada želim imati mogućnost određivanja na koju adresu i koji sadržaj želim poslati.

API sada izgleda ovako:

Nodemailer & NodeJS – API za slanje emaila

Ovdje se može vidjeti da podatke šaljem kroz req.body i upravo je to razlog zbog kojeg koristim body-parser. U slučaju da nisam koristio body-parser dobio bi sljedeću grešku.

Ovdje se može vidjeti da podatke šaljem kroz <span class="lang:js decode:true  crayon-inline">req.body</span> i upravo je to razlog zbog kojeg koristim <strong><em><a href="https://www.npmjs.com/package/body-parser" rel="noopener" target="_blank">body-parser</a></em></strong>. U slučaju da nisam koristio <em>body-parser</em> dobio bi sljedeću grešku.

Također, ako ne unesem sve potrebne podatke body-parser neće imati s čime raditi i opet ću dobiti grešku. U ovom slučaju nisam poslao e-mail adresu primatelja.

Nodemailer & NodeJS – API za slanje emaila

Nakon što unesem sve potrebne podatke, body-parser će odraditi svoje i e-mail će biti uspješno poslan/primljen.

Nodemailer & NodeJS – API za slanje emaila

nodemon – automatski restart NodeJS aplikacije

Tijekom razvoja NodeJS aplikacija potrebno je prilikom svake promjene restartati aplikaciju kako bi se promjene vidjele. To nije problem napraviti nekoliko puta, ali s vremenom čovjek se zapita postoji li mogućnost da se to automatizira.

Rješenje se nalazi u obliku nodemon skripte koja će pratiti sve promjene unutar projekta u kojemu je pokrenuta i automatski restartati aplikaciju kako bi se učinjene promjene odmah vidjele u npr. web pregledniku.

Novu ću aplikaciju kreirati naredbom

i odmah instalirati ExpressJS.

Sada u mapi projekta mogu vidjeti package.json datoteku sa sljedećim sadržajem

Sada ću kreirati index.js datoteku u kojoj određujem da će se API pokrenuti na portu 1337

API pokrećem naredbom $ node index.js

nodemon - automatski restart NodeJS aplikacije

U web pregledniku sada mogu vidjeti sljedeće

nodemon – automatski restart NodeJS aplikacije

Trenutno u projekt nije instaliran nodemon i zato prilikom svake promjene moram ručno stopirati (CTRL+C) i ponovno pokrenuti (node index.js) API.

nodemon - automatski restart NodeJS aplikacije

nodemon instalacija

nodemon se može instalirati na dva načina. Lokalno unutar projekta i globalno na računalu.

Sljedećom naredbom instaliram nodemon lokalno unutar projekta

U slučaju da želim nodemon instalirati globalno na računalo koristim sljedeću naredbu

Datoteka package.json sada ima jedan novi redak.

Projekt sada pokrećem naredbom

I sada će bilo koja promjena unutar projekta rezultirati automatskim restartom

nodemon – automatski restart NodeJS aplikacije

Zaključak

nodemon je posebno koristan prilikom razvoja NodeJS aplikacija, dok će se u produkciji koristiti npr. PM2, jer tada se događa najviše promjena i može biti jako naporno nakon svake promjene ručno raditi restart projekta. Više o skripti moguće je pronaći na poveznici https://github.com/remy/nodemon

Kako postaviti i koristiti WordPress REST API: Osnovna provjera autentičnosti

U ovom ću blog postu pokazati kako omogućiti korištenje WordPress REST API-ja sa CRUD (Create, Read, Update, Delete) mogućnostima dok za neki od sljedećih blog postova planiram napraviti jednostavnu Ionic aplikaciju koja će koristiti ovdje kreiran API.

Dokumentacija koju koristim za ovaj blog post: REST API Handbook

Uvod

Za početak je važno znati da autentifikacija nije isto što i autorizacija. U ovom blog postu govorit ćemo o autentifikaciji koja označava proces provjere točnosti pristupnih podataka korisnika koji traži pristup određenom sustavu. To znači da autentificirani korisnik može izvršavati CRUD operacije uz uvjet da pri svakom zahtjevu pošalje “dokaz” o valjanosti pristupnih podataka.

S druge strane, autorizacija identificira i dodjeljuje pristup resursima sustava. U slučaju WordPressa to možete vidjeti kroz različite uloge koje je moguće zadati korisnicima: pretplatnik, suradnik, autor, urednik, administrator. Vidjet ćete i kasnije da prilikom korištenja API-ja autor neće moći npr. promijeniti parametre nekog blog posta dok će urednik ili administrator to moći.

Priprema

Za pripremu su potrebni:

  • JSON Auth plugin https://github.com/WP-API/Basic-Auth
  • Korisnik s kojim ćemo vršiti autentifikaciju

Osnovna autentifikacija (Basic authentication) podrazumijeva slanje korisničkog imena i lozinke u zaglavlju (header) svakog zahtjeva (request).

Kako bi uopće omogućili osnovnu provjeru autentičnosti potrebno je instalirati plugin Basic Authentication handler (https://github.com/WP-API/Basic-Auth).

JSON Basic Authentication

Sada ćemo kreirati korisnika čije ćemo pristupne podatke (korisničko ime: TestKorisnik, lozinka: OvoJeLozinka) koristiti u zaglavlju svih zahtjeva koje ćemo slati.

WordPress REST API - Novi korisnik

Sada smo spremni i možemo testirati slanje zahtjeva koristeći Postman (A complete API Development Environment).

Kreiranje blog posta (POST /wp/v2/posts)

Za kreiranje novog blog posta potrebni su:

  • URL na koji ćemo slati zahtjev
  • Korisničko ime i lozinka
  • Tijelo poruke (naslov, sadržaj i dr.)

WordPress REST API: Osnovna provjera autentičnosti

Kao što se može vidjeti iz prethodne animacije scenarij je sljedeći.

– Zahtjev za kreiranjem novog blog posta šaljemo na URL “…/wp-json/wp/v2/posts/”
– Koristimo korisničko ime “TestKorisnik” i lozinku “OvoJeLozinka” koji se pretvaraju u base64 string oblika “Basic VGVzdhaXMuYWxhbUBjbG91ZHdheXMuY29tOmVKNWtuU24zNVc=” koji ide u zaglavlje zahtjeva.
– S obzirom da se ovdje radi o kreiranju novog blog posta uz zaglavlje šaljemo i tijelo (body) poruke koje se sastoji od dvije stavke, naslova i statusa.
– Na kraju dobijemo status 201 što znači da je blog post uspješno kreiran što se može vidjeti unutar sučelja WordPressa.

Uređivanje blog posta (POST /wp/v2/posts/id)

Za uređivanje postojećeg blog posta potrebni su:

    WordPress REST API ID
  • URL na koji ćemo slati zahtjev
  • ID blog posta kojeg želimo urediti
  • Korisničko ime i lozinka
  • Tijelo poruke (neki od parametara)

WordPress REST API UPDATE

Kao što se može vidjeti iz prethodne animacije scenarij je sljedeći.

– Zahtjev za kreiranjem novog blog posta šaljemo na URL “…/wp-json/wp/v2/posts/id”
– Koristimo korisničko ime “TestKorisnik” i lozinku “OvoJeLozinka” koji se pretvaraju u base64 string oblika “Basic VGVzdhaXMuYWxhbUBjbG91ZHdheXMuY29tOmVKNWtuU24zNVc=” koji ide u zaglavlje zahtjeva.
– S obzirom da se ovdje radi o uređivanju postojećeg blog posta uz zaglavlje šaljemo i tijelo (body) poruke koje se može sastojati od nekoliko parametara. Konkretno u ovom primjeru promijenit ćemo autora i kategoriju blog posta.
– Na kraju dobijemo status 200 što znači da je blog post uspješno uređen što se može vidjeti unutar sučelja WordPressa.

Vratimo se nakratko na pitanje autorizacije. Kada sam u jednom od prethodnih koraka kreirao korisnika “TestKorisnik” stavio sam mu ulogu “Autor” međutim korisnik s tom ulogom nema sva prava i nije u mogućnosti izvršiti gore navedenu radnju jer dobije poruku sa statusom 403.

Međutim, kada sam mu dodijelio ulogu “Urednik” korisnik je bez problema mogao putem API-ja izvršiti uređivanje blog posta.

Brisanje blog posta (DELETE /wp/v2/posts/id)

Za brisanje postojećeg blog posta potrebni su:

  • URL na koji ćemo slati zahtjev
  • ID blog posta kojeg želimo urediti
  • Korisničko ime i lozinka

WordPress REST API DELETE

Kao što se može vidjeti iz prethodne animacije scenarij je sljedeći.

– Zahtjev za brisanjem postojećeg blog posta šaljemo na URL “…/wp-json/wp/v2/posts/id”
– Koristimo korisničko ime “TestKorisnik” i lozinku “OvoJeLozinka” koji se pretvaraju u base64 string oblika “Basic VGVzdhaXMuYWxhbUBjbG91ZHdheXMuY29tOmVKNWtuU24zNVc=” koji ide u zaglavlje zahtjeva.
– Na kraju dobijemo status 200 što znači da je blog post uspješno obrisan što se može vidjeti unutar sučelja WordPressa.

Dohvaćanje svih blog postova (GET /wp/v2/posts)

Za dohvaćanje svih blog postova potreban je samo URL na koji će se slati zahtjev.

WordPress REST API GET

Dohvaćanje jednog blog posta (GET /wp/v2/posts/id)

Za dohvaćanje jednog blog posta potrebni su:

  • URL na koji ćemo slati zahtjev
  • ID blog posta kojeg želimo prikazati
  • Korisničko ime i lozinka

WordPress REST API GET Single

Kako napraviti REST API koristeći JSON Server

Iako sam ranije već objavio jedan sličan blog post pod nazivom “Izrada RESTful API-ja koristeći Node.js i Express.js” sada ću obraditi nešto slično za što vjerujem da bi vam moglo biti jednostavnije i brže za napraviti.

U najvećem broju slučajeva kada počnete raditi na novom projektu u nekoj novoj tehnologiji napravit ćete CRUD aplikaciju, a kako bi to bilo moguće potreban vam je API s podacima. Tu u priču ulazi JSON Server.

JSON Server je npm paket i sve što uz njega trebate je obična JSON datoteka.

Instalacija

JSON Server možete instalirati globalno (u ovom primjeru koristim globalnu instalaciju)

ili lokalno

Više o npm-u možete saznati u službenoj dokumentaciji.

Nakon instalacije provjerite jeste li ispravno instalirali JSON Server json-server -v. Ako jeste možete krenuti na sljedeći korak.

JSON Server verzija

JSON datoteka

Ako već nemate pri ruci nekakvu JSON datoteku možete napraviti nešto slično ovome. Znači, imamo primjer imenika koji se sastoji od tri objekta. Datoteka neka se zove db.json

Pokretanje JSON Servera

Pokrećemo ga koristeći naredbu

JSON Server pokretanje

I kao što se može vidjeti API je pokrenut na adresama

JSON Server pokretanje u web pregledniku

CRUD operacije

I napokon se možemo prebaciti na ono zbog čega smo ovdje. Za potrebe pozivanja API-ja koristit ćemo Postman.

GET

JSON Server GET

POST

JSON Server POST

PUT

JSON Server PUT

DELETE

JSON Server DELETE

Zaključak

Sve gore navedeno su samo osnovni primjeri. Više o ostalim, naprednijim, mogućnostima potražite u službenoj dokumentaciji.