חיפוש
  • יניב אור

מערכת מבוססת microservices - חלק 3 - שרתי API

עודכן ב: אפר 11

חיפשתי boilerplate קליל של שרת API מבוסס NodeJS - לפעולות CRUD - שעובד מול mongo, בלי ניהול משתמשים ואותנטיקציה. מצאתי אחד והוא לא בויילרפלייט אלא גנרטור (generator) שזה אפילו טוב יותר. פרטים בהמשך. לפני כן, למה node? כי זאת הסביבה שאני מכיר אז באופן טבעי פניתי לכיוון הזה. אנחנו עוסקים כאן במיקרו-שירותים, אחד העקרונות הוא שאפשר לבחור שירותים שנכתבו בטננולוגיות שונות משום שלא מדובר על תוכנה מונוליטית שכתובה בשפה אחת. האם זה כל כך מסובך ללמוד קוד או להכיר שרתי API מוכנים - לפי הדרישות שלי - שנכתבו בטכנולוגיות שלא עבדתי איתן או לפחות לא עבדתי איתן בשוטף? לא מסובך. הכל עניין של זמן. האם הדרישות שלי יכולות להיות גמישות יותר? למשל, לוא דווקא mongo אלא SQL - לפי הצורך, כמובן. בהמשך אכנס לזה, אכיר סביבות חדשות ואחזור לסביבות ישנות כמו PHP איתו עבדתי במשך 12 שנה ברצף ובשנים האחרונות זנחתי לטובת node.


התוכנה generator-rest

נחזור לגנרטור שמצאתי, מדובר על generator-rest - מייצר שרתי API מבוססי node שעובדים מול mongo עם mongoose. יש אפשרות להוסיף ניהול משתמשים ואותנטיקציה. הכל במילוי פרטים באמצעות שורת הפקודה (CLI). הוא מבוסס על yeoman-generator - מחולל אפליקציות node. מקום 40 (בזמן כתיבת הפוסט) בספריות npm הנפוצות עליהן מתבססות ספריות ותוכנות אחרות.

* ניסיתי להריץ את הפקודות בזמן כתיבת הפוסט ולחולל שרת חדש. מסיבה כלשהי (שקשורה ל-mongoose) השרת קורס לאחר npm start. בהמשך אבדוק את העניין.


השרתים node-api-accounts ו-node-api-posts

בניתי לפני זמן מה - בעזרת המחולל הזה - שני שרתים, אחד ל-accounts והשני ל-posts - ואיתם אני משתמש כרגע.


ה-repos כאן:

https://github.com/YanivOr/node-api-accounts

https://github.com/YanivOr/node-api-posts


לא היה שום צורך לגעת בקוד כדי שכל פעולות ה-CRUD יעבדו כמו שצריך. מה שכן כתבתי והוספתי למערכת הקיימת זה קוד שמטפל ב-JWT token שמגיע עם הבקשות (ב-Authorization header) ועובד מול שרת ה-auth. אגב, אני שוב מזכיר שברגע שמייצרים את השרת, יש אפשרות להוסיף תמיכה ב-auth. החלטתי לכתוב את זה from scratch.


הוספתי תיקיה בשם auth מתחת ל-services ולצד express, mongoose, response. וכתבתי שני קבצים: index.js ו-jwt-handler.js.


src/services/auth/index.js

הפונקציה verifyAuth חותכת את ה-JWT מה-header ומעבירה אותו לאימות בפונקציה verifyJWT. במידה והאימות עבר בהצלחה, היא מחזירה next. מי שעושה שימוש בפונקציה הזאת, בכל בקשה לשרת, היא הספריה express באמצעות use.


את הגדרות לשימוש בפונקציה הזאת ע"י express הוספתי לקובץ הבא שכבר היה קיים והכיל שימוש בפונקציות נוספות. אגב, יש חשיבות לסדר של ה-app.use. לשים לב לזה. וכאן נכנס ה-next שהוזכר קודם לכן.


src/services/express/index.js


נעבור לפונקציה verifyJWT שנמצאת ב-jwt-handler.js.


src/services/auth/jwt-handler.js

הפונקציה verify מאמתת את ה-secret מול ה-publicKey ובודקת תפוגת תוקף ואת שאר הפרמטרים ב-claim מול ה-verifyOptions.


אני צריך לכתוב error handler טוב יותר לפי השגיאות השונות.


ראה והשווה עם: מערכת מבוססת microservices - חלק 1 - אימות משתמשים.



נעבור ל-Dockerfile ול-docker-compose.yml.


Dockerfile


docker-compose.yml

ה-docker-compose.yml מכיל, כמובן, מכונות נוספות שהופיעו בסדרת המאמרים.


בהמשך נוסיף תמיכה ב-HTTPS ו-SSL.


השרת, אגב, מקבל מספר פרמטרים לסינון, מיון וכדומה - פרמטרים מובנים מהספריה querymen:

הפרמטר q - לחיפוש טקסט - רלוונטי רק במידה והפלאגין mongoose-keywords מותקן ואז נעשה חיפוש בשדה keywords.




© 2023 by DO IT YOURSELF. Proudly created with Wix.com