پیاده‌سازی Refresh Token در Nodejs

خیلی وقت‌ها تو پروژه‌های کوچیک زمانی که میخوایم احراز هویت رو به صورت Token Base پیاده‌سازی کنیم، فقط AccessToken رو در نظر می‌گیریم، در صورتی که در واقع میشه گفت تو بیشتر پروژه‌ها Token Base بدون پیاده سازی RefreshToken کامل نیست.

SPA = Single-Page Application;    AS = Authorization Server;    RS = Resource Server;    AT = Access Token; RT = Refresh Token.
SPA = Single-Page Application; AS = Authorization Server; RS = Resource Server; AT = Access Token; RT = Refresh Token.


از مهم ترین دلایلی که نیاز به RefreshToken داریم اینه که:
  • فرض کنید AccessToken کاربر به هر دلیل لو میره، پس باید راهی باشه که کاربر بتونه AccessToken قبلیش رو Block کنه.
  • نیاز داریم که Logout داشته باشیم.


البته هر دو حالت بالا رو میشه بدون استفاده از RefreshToken هم پیاده‌سازی کرد، اما راه اصلی اینه که از RefreshToken استفاده کنیم...

نکته مهم دیگه ای که میشه بهش اشاره کرد اینه که از نظر امنیتی نباید ExpireTime برای AccessToken طولانی باشه، چون همونطور که بالاتر توضیح دادم ممکنه به هر دلیل توکن کاربر لو بره. پس میایم ExpireTime رو برای AccessToken یه زمان کوتاه مثلا در حد 15 دقیقه ولی در عوض این زمان رو برای RefreshToken طولانی تر مثلا در حد یک هفته در نظر می‌گیریم.

و بعد زمانی که به Expire شدن AccessToken نزدیک شدیم، کاربر درخواست Refresh میده تا یک AccessToken دیگه بهش اختصاص داده بشه برای 15 دقیقه.


اگه با RefreshToken آشنا نیستین و یا دوست دارین بیشتر در موردش بدونین، لینک‌های زیر میتونه مفید باشه:

https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/
https://developer.okta.com/docs/guides/refresh-tokens/main/
https://auth0.com/learn/refresh-tokens/


خلاصه که بخش Authentication یکی از پروژه ها رو جدا کردم گذاشتم Github که شاید بتونه برای کسی مفید باشه.

(پروژه با Nodejs و Nestjs پیاده سازی شده و توضیحات مرتبط باهاش رو تو Github گذاشتم)


تو حالت‌های زیر میتونه قابل استفاده باشه:
  • زمانی که میخواین Authentication رو تو پروژه‌های Nestjsی پیاده سازی کنین.
  • برای حالتی که پروژتون Nodejsی نیست ولی میخواین احراز هویت رو به صورت سرویس جدا داشته باشین، که خب تو این حالت هم کار خیلی سادست، User Credentials رو میفرستین برای سرویس Authentication ، بهتون توکن میده، حالا از روی JWT-Secret-Key (که هر دو طرف باید یکی باشه) میاین valid بودن توکن‌ها رو چک می‌کنید.

تو اولین فرصت Authorization هم بهش اضافه می‌کنم که کامل‌تر بشه. (از CASL استفاده می‌کنم)


لینک repository پروژه:

https://github.com/EmadAbedini/RefreshToken

اینطوری نیست که هر جا Token Base داریم باید حتما Refresh Token هم داشته باشیم...
بیشتر توی این حالت ها نیازه که پیاده سازی بشه:
* توی Single sign-on (SSO) ها
* زمانی که معماری Microserviceه و سرویس احراز هویت جداست.
* زمانی که معماری Monolithicه و احراز هویت بخشی از پروژست.


شاد و موفق باشین :)