Node.js میں Google Service Account JWT تیار کرنا

زیادہ تر ڈویلپرز Google APIs کو کال کرنے کے لیے googleapis npm پیکیج کا استعمال کرتے ہیں۔ یہ اچھا کام کرتا ہے، لیکن یہ آپ کے پروجیکٹ میں 380KB اور 450 سے زیادہ dependencies بھی شامل کر دیتا ہے۔

اگر آپ کو صرف ایک سادہ CI اسکرپٹ کے لیے ایک API کی ضرورت ہے، تو یہ ضرورت سے زیادہ (overkill) ہے۔

میں نے صرف تین Node.js built-ins: crypto, fetch, اور URL کا استعمال کرتے ہوئے URL index status چیک کرنے کے لیے ایک اسکرپٹ بنایا ہے۔ یہ کسی بھی بیرونی (external) پیکیج کا استعمال نہیں کرتا۔

Authentication RFC 7523 کے مطابق ہے۔ اسے کرنے کا طریقہ یہ ہے:

  • اپنی service account email اور private key کا استعمال کرتے ہوئے ایک JWT بنائیں۔
  • اس JWT کو Google token endpoint پر POST کریں۔
  • ایک مختصر مدت (short-lived) کا access token حاصل کریں۔
  • اس ٹوکن کو اپنی API requests کے لیے Bearer header کے طور پر استعمال کریں۔

JWT کے لیے ان claims کی ضرورت ہوتی ہے:

  • iss: آپ کی client email۔
  • scope: webmasters.readonly۔
  • aud: Google token URL۔
  • iat: موجودہ وقت (current time)۔
  • exp: موجودہ وقت میں 3600 سیکنڈز کا اضافہ۔

نوٹ: webmasters scope کا استعمال کریں۔ نیا searchconsole scope URL Inspection API کے لیے کام نہیں کرتا۔

مشکل حصہ Base64url encoding ہے۔ اسے compatible بنانے کے لیے آپ کو padding ہٹانی ہوگی اور characters کو تبدیل کرنا ہوگا۔ آپ اپنی RSA private key کے ساتھ JWT کو sign کرنے کے لیے node:crypto ماڈیول کا استعمال کر سکتے ہیں۔ آپ کی Google Cloud JSON فائل سے ملنے والی key براہ راست کام کرتی ہے۔

جب آپ ٹوکن کا تبادلہ (exchange) کریں، تو raw error response کو log کریں۔ Google مخصوص پیغامات فراہم کرتا ہے جیسے کہ "Service account not found"۔ یہ آپ کو غلطیوں کو تیزی سے ٹھیک کرنے میں مدد دیتا ہے۔

یہ طریقہ کار ان حالات میں بہترین کام کرتا ہے جب:

  • آپ CI pipeline میں ایک ہی API استعمال کرتے ہیں۔
  • آپ اپنے repo کو ہلکا (light) رکھنا چاہتے ہیں۔
  • آپ auth flow کو سمجھنا چاہتے ہیں۔

اسے تب استعمال نہ کریں اگر:

  • آپ بہت سی مختلف Google APIs کو کال کرتے ہیں۔
  • آپ کو خودکار ٹوکن ریفریشنگ (automatic token refreshing) کی ضرورت ہے۔
  • آپ ایک بڑا production server بنا رہے ہیں۔

محدود کاموں (narrow tasks) کے لیے سینکڑوں چھپی ہوئی dependencies کے بجائے چھوٹا اور پڑھنے کے قابل (readable) کوڈ بہتر ہے۔

Source: https://dev.to/morinaga/rolling-a-google-service-account-jwt-in-nodejs-without-the-googleapis-package-22am