Mostantól itt dokumentáljuk a backenndel kapcsolatos haladást. Azt beszéltük meg, hogy adatbázisnak a MongoDB-t fogjuk használni, mivel a usereket szereptől függetlenül fogjuk egy adatbázisban tárolni, így megspórolunk csomó null értéket. Csütörtökön létrehoztuk a projektet, majd elkezdtünk azzal foglalkozni, hogy létrehozzuk az endpointokat és összekössük a MongoDB-vel az alkalmazást (Ehhez létrehoztunk egy Atlas-os clustert hogy ne lokálisan tárolódjanak az adatok). Ez utóbbival rendesen elakadtunk, kb 5 óránk ment el azzal, hogy az application.properties-ben a Mongo URI-ját idézőjellel együtt írtuk meg, pedig anélkül kellett volna. Pénteken erre rájöttünk és folytattuk a munkát az endpointok megírásával. Ezek teszteléséhez a Postman-t használtuk. Miután megvoltunk a nagyjával, elkezdtünk azzal foglalkozni, hogy hostoljuk a Spring alkalmazást Heroku segítségével. Ez elérhető itt és tesztelhető is Postmannel, vagy a linkre kattintva.
A feladatunk az volt erre a hétre, hogy jwt tokenes beléptetéssel bővítsük az alkalmazást, viszont sajnos nem jártunk sikerrel, mert nem sikerült teljesen megérteni hogy hogyan kellene ezt implementálnunk. Megnéztünk cikkeket a témában, meg több tutorial sorozatot is követtünk, de mindig egy ponton elakadtunk. Ezekből itt van néhány:
- java-config-spring-security
- Spring Boot Security - RomanianCoder
- Spring Boot Authorization Tutorial: Secure an API (Java)
- Spring Boot and Spring Security with JWT including Access and Refresh Tokens 🔑 - Amigoscode
- Spring Security: Authentication and Authorization In-Depth
- Spring Boot JWT bootcamp 2021 | Best tutorial in the universe
Mivel a múlt héten nem sikerült a feladatunkat rendesen elvégezni, ezért ezen a héten is ugyan azt kell csinálnunk, ehhez pedig kaptunk egy tutorialt segítségül. Ezt végigcsinálva nem működött még az authentikáció, viszont rövid keresgélés után rájöttünk, hogy a jjwt dependency outdated, ezért kicseréltük frissekre az alábbi README alapján. Ezek után olyan hibába ütlöztünk, hogy néhány függvény deprecated lett azóta, ami miatt a secret-et nem az application.propertiesbe tettük hard codeolva, hanem generáltattunk egy megfelelőt a SecretKey secret = Keys.secretKeyFor(SignatureAlgorithm.HS512);
kód segítségével. Így már működött is az authentikáció, viszont egyelőre csak egy beégetett felhasználó volt engedélyezett az oldalon, csak azzal a felhasználónévvel és jelszóval lehetett bármit csinálni az oldalon.
Folytattuk tovább a tutorial sorozatot ezen a linken, hogy már ne csak egy, hanem az összes, az adatbázisunkban szereplő felhasználó be tudjon lépni az alkalmazásunkba.
A felhasználók role-jait a jwt tokenbe tettük bele, hogy a későbbiekben le lehessen ellenőrizni, hogy bizonyos felhasználóknak milyen függvények hívásához van jogosultsága.
Megírtuk az authorization részt, így most minden felhasználó csak azokat az endpointokat használhatja, amihez engedéle van a role-ja alapján. Ehhez a Spring hivatalos dokumentációjában találtunk segítséget. Pontosítottuk az alkalmazás OpenAPI dokumentációját és summary-kkel láttuk el, hogy könnyebben el lehessen rajta igazodni a frontendeseknek. Megpróbáltuk megoldani, hogy a MongoDB jelszavunk ne legyen kint githubon ahol bárki megtalálhatja, de hosszas próbálkozás után sajnos nem jártunk sikerrel. Arra jutottunk, hogy a Jasypt toollal titkosítani lehet bármit, amit el akarunk rejteni mások elől, majd egy előre megadott kulcs segítségével visszafejteni az eredeti Stringet, a kulcsot meg lokálisan kell tárolni a biztonságosság érdekében. Azért hagytuk abba a próbálkozást, mert rájöttünk, hogy ha ki akarjuk tenni Herokura az appot, akkor ott nem fog működni ez, hiszen nem tudunk a Heroku szerverekre kulcsokat pakolni. (Meg egyébként sincs akkora veszélynek kitéve az alkalmazásunk hogy erre nagy szükség legyen)
Ezen a héten a validációval foglalkoztunk. A modeljeinket megváltoztattuk úgy, hogy csak az általunk megadott formátumú és hosszú adatokat fogadják el, ellenkező esetben pedig hibát dobjanak. Ezen felül a controllerekben le kellett ellenőrizni, hogy adott objektumok amiket szerkeszteni vagy törölni akar egy felhasználó, létezik-e, ezen felül pedig azt, hogy ha létezik, akkor az a saját idja-e, vagy ha nem, akkor ADMIN jogosultságú-e. Ez után az OfferController accept, reject és delete függvényeit refaktoráltuk hogy ne legyen kódismétlés de mégis jól szétválaszthatóak legyenek a függvények.
Ezen a héten a sprint eltérítést valósítottuk meg és az OpenApi dokumentációt csináltuk újra mivel az ami idáig volt az egy generált dokumentáció volt(az IntelliJ által), és nem volt benne megtalálható ami egy OpenApi dokumentációban elvárható lenne.
Ezen a héten a frontendesek kéréseit valósítottuk meg, ezzel kijavítva az alkalmazásban maradt hibákat. Ez után megírtuk a dokumentációját az appnak, majd legeneráltuk hozzá a szükséges diagramokat.