پیاده‌سازی JWT حساب سرویس گوگل در Node.js

بسته googleapis در npm، استاندارد کار با Google APIs است.

کار می‌کند، اما ۳۸۰ کیلوبایت حجم و بیش از ۴۵۰ وابستگی (dependency) به پروژه شما اضافه می‌کند.

اگر برای یک اسکریپت CI فقط به یک API نیاز دارید، نیازی به چنین حجم سنگینی ندارید.

من اسکریپتی برای بررسی وضعیت ایندکس URL نوشتم که تنها با ۶۰ خط کد کار می‌کند.

این اسکریپت از سه ماژول داخلی Node.js استفاده می‌کند:

  • crypto
  • fetch
  • URL

این روش هیچ بسته‌ای به مخزن (repository) شما اضافه نمی‌کند.

احراز هویت حساب سرویس گوگل از استاندارد RFC 7523 پیروی می‌کند.

فرآیند کار به این صورت است:

  • یک JWT با استفاده از ایمیل کلاینت و کلید خصوصی (private key) خود بسازید.
  • آن JWT را به endpoint توکن گوگل POST کنید.
  • یک توکن دسترسی (access token) دریافت کنید.
  • از آن توکن در هدر درخواست API خود استفاده کنید.

یک نکته حیاتی: از scope مربوط به webmasters استفاده کنید. scope جدیدتر یعنی searchconsole برای URL Inspection API کار نخواهد کرد.

برای JWT باید از کدگذاری Base64url استفاده کنید. Base64 استاندارد به سه تغییر نیاز دارد:

  • حذف padding.
  • جایگزینی + با -.
  • جایگزینی / با _.

کلید خصوصی شما از Google Cloud از قبل در قالب صحیح است. برای امضای (sign) توکن نیازی به کتابخانه‌های خارجی ندارید.

هنگام فراخوانی endpoint توکن، پاسخ خطا را لاگ کنید. گوگل دلایل مشخصی برای شکست‌ها ارائه می‌دهد، مانند منقضی شدن توکن‌ها یا نبود حساب سرویس.

برای خودِ فراخوانی API:

  • هدر Authorization را روی Bearer [token] تنظیم کنید.
  • مطمئن شوید siteUrl شما دقیقاً با ویژگی (property) Search Console شما مطابقت دارد.
  • ایمیل حساب سرویس خود را به عنوان یک کاربر در Search Console اضافه کنید.

این رویکرد برای وظایف محدود مانند خط لوله‌های (pipelines) CI بهترین عملکرد را دارد.

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

  • چندین Google API.
  • بازسازی (refresh) خودکار توکن.
  • منطق پیچیده برای تلاش مجدد (retry logic).
  • کدهای سرور عملیاتی (production) با پیچیدگی بالا.

برای یک وظیفه واحد در CI، ۶۰ خط کد بهتر از ۴۵۰ وابستگی است. درک این جریان خام همچنین عیب‌یابی (debugging) را در زمان از کار افتادن کتابخانه‌ها آسان‌تر می‌کند.

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