למד כיצד לטפל באימות באמצעות Node באמצעות Passport.js

תמכו בי בקריאה מהמקור המקורי: המקור המקורי

במאמר זה תלמד כיצד לטפל באימות עבור שרת הצומת שלך באמצעות Passport.js. מאמר זה אינו מכסה אימות Frontend. השתמש בזה כדי להגדיר את אימות ה- Backend שלך (צור אסימון לכל משתמש והגן על מסלולים).

זכור שאם אתה נתקע במדרגה כלשהי, אתה יכול להתייחס לריפו זה של GitHub .

במאמר זה אלמד את הדברים הבאים:

  • טיפול במסלולים מוגנים
  • טיפול באסימני JWT
  • טיפול בתגובות לא מורשות
  • יצירת ממשק API בסיסי
  • יצירת מודלים וסכמות

מבוא

מהו Passport.js?

דרכון הוא תוכנת אימות עבור Node.js. מכיוון שהוא גמיש ומודולרי במיוחד, ניתן להפיל את Passport באופן בלתי פולשני לכל יישום אינטרנט מבוסס אקספרס. מערך אסטרטגיות מקיף תומך באימות באמצעות שם משתמש וסיסמה, פייסבוק, טוויטר ועוד. גלה מידע נוסף על Passport כאן.

הדרכה

יצירת שרת הצמתים שלנו מאפס

צור ספריה חדשה באמצעות "app.js" זהקובץ בפנים:

אנו נתקין נודמון לפיתוח קל יותר.

ואז נפעיל איתו את "app.js" שלנו.

$ nodemon app.js

יצירת מודל המשתמש

צור תיקיה חדשה בשם "דגמים",וצור את הקובץ "Users.js" בתוך אותה תיקייה.זה המקום בו נגדיר את "UserSchema" שלנו. אנחנו הולכים להשתמש JWTו Cryptoלייצר hashו saltמן קבלתי passwordהמחרוזת. מאוחר יותר זה ישמש לאימות המשתמש.

בואו נוסיף את המודל החדש שנוצר ל- “app.js”.

הוסף את השורה הבאה לקובץ "app.js" לאחר התצורה Mongoose:

require('./models/Users');

הגדר את הדרכון

צור תיקייה חדשה "config" עם הקובץ "passport.js" בתוכה:

בקובץ זה אנו משתמשים בשיטה validatePasswordשהגדרנו ב-User model. בהתבסס על התוצאה, אנו מחזירים תפוקה שונה מזו של פספורט LocalStrategy.

בואו נחבר את "passport.js" לקובץ "app.js" שלנו. הוסף את השורה הבאה מתחת לכולםmodels :

require('./config/passport');

מסלולים ואפשרויות אימות

צור תיקיה חדשה בשם "מסלולים" עם הקובץ "auth.js" בתוכה.

בקובץ זה אנו משתמשים בפונקציה getTokenFromHeadersלקבל JWT האסימון כי יישלח מן צד הלקוח של הכותרות של הבקשה . אנחנו גם ליצור authאובייקט עם optionalו requiredנכסים. נשתמש בהם בהמשך במסלולים שלנו.

באותה תיקיית "מסלולים" צור קובץ "index.js":

כעת אנו זקוקים לתיקיית "api" בתוך תיקיית "מסלולים", ובתוכה קובץ "index.js" נוסף.

כעת, בואו ניצור את הקובץ "users.js" הדרוש לנו ב- "api / index.js".

ראשית, אנו הולכים ליצור מסלול אימות אופציונלי‘/’ שישמש ליצירת מודלים חדשים (רישום).

router.post('/', auth.optional, (req, res, next) ...

לאחר מכן אנו הולכים ליצור מסלול אימות אופציונלי נוסף ‘/login’. זה ישמש להפעלת תצורת הדרכון שלנו ולאימות סיסמה שהתקבלה באמצעות דואר אלקטרוני.

router.post('/login', auth.optional, (req, res, next) ...

לבסוף, ניצור מסלול אימות נדרש , שישמש להחזרת המשתמש המחובר כעת. רק למשתמשים מחוברים (משתמשים שהאסימון שלהם נשלח בהצלחה דרך כותרות הבקשה) יש גישה למסלול זה.

router.get('/current', auth.required, (req, res, next) ...

בואו נוסיף את תיקיית "המסלולים" שלנו ל- "app.js".הוסף את השורה הבאה מתחת לדרכון שלנוrequire :

app.use(require('./routes'));

בדיקת מסלול

אני אשתמש בדוורלשלוח בקשות לשרת שלנו.

השרת שלנו מקבל את הגוף הבא:

{ "user": { "email": String, "password": String } }

יצירת בקשת POST ליצירת משתמש

גוף הבדיקה:

תְגוּבָה:

{ "user": { "_id": "5b0f38772c46910f16a058c5", "email": "[email protected]", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVyZGVsamFjLmFudG9uaW9AZ21haWwuY29tIiwiaWQiOiI1YjBmMzg3NzJjNDY5MTBmMTZhMDU4YzUiLCJleHAiOjE1MzI5MDgxNTEsImlhdCI6MTUyNzcyNDE1MX0.4TWc1TzY6zToHx_O1Dl2I9Hf9krFTqPkNLHI5U9rn8c" } }

כעת נשתמש באסימון זה ונוסיף אותו ל"כותרות "שלנו בתצורת הדוור.

And now let’s test our auth only route.

Creating a GET request to return the currently logged in user

Request URL:

GET //localhost:8000/api/users/current

Response:

{ "user": { "_id": "5b0f38772c46910f16a058c5", "email": "[email protected]", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImVyZGVsamFjLmFudG9uaW9AZ21haWwuY29tIiwiaWQiOiI1YjBmMzg3NzJjNDY5MTBmMTZhMDU4YzUiLCJleHAiOjE1MzI5MDgzMTgsImlhdCI6MTUyNzcyNDMxOH0.5UnA2mpS-_puPwwxZEb4VxRGFHX6qJ_Fn3pytgGaJT0" } }

Let’s try to do it without token in “Headers”.

Response:

The end

Thank you for going through this tutorial. If you notice any errors please report them to me. If you got stuck on any step, please refer to this GitHub repo.

You can contact me through:

  • erdeljac DOT antonio AT gmail.com
  • Linkedin

Check out my app SwipeFeed.