إنشاء JWT لحساب خدمة Google في Node.js
يستخدم معظم المطورين حزمة googleapis عبر npm لاستدعاء Google APIs. وهي تعمل بشكل جيد، ولكنها تضيف أيضاً 380 كيلوبايت وأكثر من 450 تبعية (dependencies) إلى مشروعك.
إذا كنت تحتاج فقط إلى API واحد لسكربت CI بسيط، فإن هذا يعتبر مبالغاً فيه.
لقد قمت ببناء سكربت للتحقق من حالة فهرسة URL باستخدام ثلاث مكتبات مدمجة فقط في Node.js وهي: crypto و fetch و URL. إنه لا يستخدم أي حزم خارجية.
تتبع عملية المصادقة معيار RFC 7523. إليك كيفية القيام بذلك:
- إنشاء JWT باستخدام بريد حساب الخدمة (service account email) والمفتاح الخاص (private key).
- إرسال طلب POST لهذا الـ JWT إلى نقطة نهاية الرمز (Google token endpoint).
- استلام رمز وصول (access token) قصير الأمد.
- استخدام ذلك الرمز كـ Bearer header لطلبات الـ API الخاصة بك.
يحتاج الـ JWT إلى هذه الادعاءات (claims):
iss: بريد العميل الخاص بك.scope:webmasters.readonly.aud: رابط Google token URL.iat: الوقت الحالي.exp: الوقت الحالي مضافاً إليه 3600 ثانية.
ملاحظة: استخدم نطاق webmasters. نطاق searchconsole الأحدث لا يعمل مع URL Inspection API.
الجزء الصعب هو ترميز Base64url. يجب عليك إزالة الحشو (padding) واستبدال الأحرف لجعله متوافقاً. يمكنك استخدام وحدة node:crypto لتوقيع الـ JWT باستخدام مفتاح RSA الخاص بك. المفتاح الموجود في ملف JSON الخاص بـ Google Cloud يعمل مباشرة.
عند استبدال الرمز، قم بتسجيل استجابة الخطأ الخام (raw error response). توفر Google رسائل محددة مثل "Service account not found". يساعدك هذا في إصلاح الأخطاء بسرعة.
هذا النهج يعمل بشكل أفضل عندما:
- تستخدم API واحداً في خط أنابيب CI (CI pipeline).
- تريد إبقاء مستودعك (repo) خفيفاً.
- تريد فهم تدفق المصادقة (auth flow).
لا تستخدم هذا إذا:
- كنت تستدعي العديد من Google APIs المختلفة.
- كنت بحاجة إلى تجديد الرمز تلقائياً (automatic token refreshing).
- كنت تبني خادماً ضخماً للإنتاج (production server).
الكود الصغير والقابل للقراءة أفضل من مئات التبعيات المخفية للمهام المحددة.