𝗥𝗼𝗹𝗹𝗶𝗻𝗴 𝗮 𝗚𝗼𝗼𝗴𝗹𝗲 𝗦𝗲𝗿𝘃𝗶𝗰𝗲 𝗔𝗰𝗰𝗼𝘂𝗻𝘁 𝗝𝗪𝗧 𝗶𝗻 𝗡𝗼𝗱𝗲.𝗷𝘀

นักพัฒนาส่วนใหญ่ใช้แพ็กเกจ googleapis บน npm เพื่อเรียกใช้งาน Google APIs ซึ่งมันก็ทำงานได้ดี แต่ก็เป็นการเพิ่มขนาดถึง 380KB และเพิ่ม dependencies มากกว่า 450 ตัวให้กับโปรเจกต์ของคุณ

หากคุณต้องการใช้เพียง API เดียวสำหรับสคริปต์ CI ง่ายๆ การใช้แพ็กเกจนี้ถือว่าเกินความจำเป็น (overkill)

ผมได้สร้างสคริปต์สำหรับตรวจสอบสถานะการทำดัชนี (index status) ของ URL โดยใช้เพียง built-ins 3 ตัวของ Node.js ได้แก่ crypto, fetch และ URL ซึ่งไม่จำเป็นต้องใช้แพ็กเกจภายนอกเลย

การยืนยันตัวตนเป็นไปตามมาตรฐาน RFC 7523 โดยมีขั้นตอนดังนี้:

  • สร้าง JWT โดยใช้ email ของ service account และ private key ของคุณ
  • ส่ง (POST) JWT นั้นไปยัง Google token endpoint
  • รับ access token ที่มีอายุการใช้งานสั้น
  • ใช้ token นั้นเป็น Bearer header สำหรับการเรียก API ของคุณ

JWT จำเป็นต้องมี claims เหล่านี้:

  • iss: client email ของคุณ
  • scope: webmasters.readonly
  • aud: URL ของ Google token
  • iat: เวลาปัจจุบัน
  • exp: เวลาปัจจุบันบวกเพิ่มอีก 3600 วินาที

หมายเหตุ: ให้ใช้ scope webmasters เนื่องจาก scope searchconsole แบบใหม่ไม่สามารถใช้งานกับ URL Inspection API ได้

ส่วนที่ยากคือการทำ Base64url encoding คุณต้องตัด padding ออกและแทนที่ตัวอักษรเพื่อให้ใช้งานร่วมกันได้ คุณสามารถใช้โมดูล node:crypto เพื่อลงลายเซ็น (sign) JWT ด้วย RSA private key ของคุณได้เลย โดยสามารถใช้ key จากไฟล์ JSON ของ Google Cloud ได้โดยตรง

เมื่อคุณทำการแลกเปลี่ยน token ให้ทำการ log raw error response ไว้ด้วย เพราะ Google จะให้ข้อความที่เฉพาะเจาะจง เช่น "Service account not found" ซึ่งจะช่วยให้คุณแก้ไขข้อผิดพลาดได้อย่างรวดเร็ว

วิธีนี้จะได้ผลดีที่สุดเมื่อ:

  • คุณใช้เพียง API เดียวใน CI pipeline
  • คุณต้องการให้ repository ของคุณมีขนาดเบา
  • คุณต้องการทำความเข้าใจขั้นตอนการยืนยันตัวตน (auth flow)

อย่าใช้วิธีนี้หาก:

  • คุณต้องเรียกใช้งาน Google APIs หลายตัวที่แตกต่างกัน
  • คุณต้องการการรีเฟรช token แบบอัตโนมัติ
  • คุณกำลังสร้างเซิร์ฟเวอร์สำหรับระบบ production ขนาดใหญ่

สำหรับงานเฉพาะทาง การใช้โค้ดขนาดเล็กที่อ่านง่าย ย่อมดีกว่าการมี dependencies ที่ซ่อนอยู่เป็นร้อยตัว

ที่มา: https://dev.to/morinaga/rolling-a-google-service-account-jwt-in-nodejs-without-the-googleapis-package-22am