Mohammad Jawad Barati
Mohammad Jawad Barati
خواندن ۲ دقیقه·۴ سال پیش

احراز هویت (Auth) تو نود.جی‌اس

خب میخوای احراز هویت بکنی کاربراتو. براشون نقش تعریف بکنی و ...

احراز هویت

چه کسی، چه دسترسی هایی دارد و به کجا ها رفته است. برای Access Control ما دو روش داریم:

روش اول Role based Access Control هست. دقیقا مثل نقش هایی هست که تو زندگی واقعی داریم ولی وقتی دیتا ها پیچیده میشه نیاز به اعمال policy روی resource/subject/environment ها داریم.

روش دوم Attribute Based Access Control هست. این روش علاوه بر ویژگی های RBAC روی resource ها و action ها هم تمرکز می کنیم.

مقدمه JWT

نکته مهم اینه که شما JWT رو ممکنه به روش های مختلف کاستومایز بکنی:

  • مثلا بیای از ۲ تا کلید (کلید عمومی و خصوصی) برای انکریپت کردن و دیکریپت کردن توکن JWT استفاده بکنی.
  • یا بیای از توکن نهایی هش بگیری و اون هش رو بدی به کلاینت
  • یا بیای توکن رو تو دیتابیس هم ذخیره بکنی و بعد از وریفای کردن توکن تازه بیای یه بار دیگه چک کنی که آیا توکن تو دیتابیس هم هست یا نه. این کار باعث میشه حتی اگه کلید ها لو برن و روش تولید توکن هم لو بره و هکر بخواد توکن رو خودش تولید بکنه، ما تو یه مرحله دیگه میتونیم تشخیص بدیم که این توکن رو خودمون تولید کردیم یا نه.

اجزای JWT

  1. هدر: شامل اطلاعات اینه که الگوریتم رمز نگاریش چیه؟ نوع توکن چیه؟
  2. پی لود: اطلاعاتی که میخوایم سمت توی توکن بزاریم
  3. امضا: چیزی که تضمین کننده اینه که توکن توسط کاربر (یا هکر) تغییر داده نمیشه

خب میبینید که توکنی که تولید میشه خیلی قشنگه. برای تولید این توکن ۳ روش داری جلوی روت

اولیش auth0، دومیش ماژول jsonwebtoken و اخرینش هم passport-jwt (پکیج های دیگه ای هم داریم. اینا دم دستی ها هستن)
اولیش auth0، دومیش ماژول jsonwebtoken و اخرینش هم passport-jwt (پکیج های دیگه ای هم داریم. اینا دم دستی ها هستن)

استفاده از passport-jwt و jsonwebtoken در کنار هم

توی passport-jwt ما از دوتا کلید استفاده می‌کنیم. یه کلید خصوصی برای امضا کردن توکنا و یه کلید عمومی برای دی‌کد کردن توکن ها. برای تولید این کلید ها هم می‌تونی از این تیکه کد استفاده بکنی:

const crypto = require('crypto'); const generateKeyPair = util.promisify(crypto.generateKeyPair); let keyPair = await generateKeyPair('rsa', { privateKeyEncoding: { type: 'pkcs1', format: 'pem' }, publicKeyEncoding: { type: 'pkcs1', format: 'pem' }, modulusLength: 4096, }); await fsPromises.writeFile(path.join(__dirname, 'id_rsa_public.pem'), keyPair.publicKey); await fsPromises.writeFile(path.join(__dirname, 'id_rsa_private.pem'), keyPair.privateKey);

تو این کد ها اومدیم خیلی ساده یه کلید عمومی و خصوصی توسط core نود.جی‌اس تولید کردیم.

و بقیه قضیه رو تو فیلم ببینید:

https://aparat.com/v/Rgurz

استفاده از پکیج jsonwebtoken

روش بعدی استفاده از پکیج jsonwebtoken هست. اونم به تنهایی که کاری هست بس طاقت فرسا. ولی خب شاید بعضی ها به دلیل dependency کمتر بخوان این راه رو برن.

استفاده از auth0.com


jwtauthenticationAuthorizationnodejstoken
برنانه نویس، مدرس، محقق. عاشق انیمه هستم و دنبال چالش ها جدید.
شاید از این پست‌ها خوشتان بیاید