OAuth 2.0: ตรวจสอบสิทธิ์ผู้ใช้ด้วย Google

OAuth2 เป็นโปรโตคอลมาตรฐานอุตสาหกรรมสำหรับการให้สิทธิ์ โดยมีกลไกให้ผู้ใช้ ให้สิทธิ์แอปพลิเคชันบนเว็บและเดสก์ท็อปเข้าถึงข้อมูลส่วนตัวได้โดยไม่ต้องแชร์ชื่อผู้ใช้ รหัสผ่าน และข้อมูลเข้าสู่ระบบส่วนตัวอื่นๆ

บทแนะนำนี้จะสร้างส่วนขยายที่เข้าถึงรายชื่อติดต่อ Google ของผู้ใช้โดยใช้ Google People API และ Chrome Identity API เนื่องจากส่วนขยายไม่ได้โหลดผ่าน HTTPS จึงไม่สามารถทำการเปลี่ยนเส้นทางหรือตั้งค่าคุกกี้ได้ ส่วนขยายจึงต้องอาศัย Chrome Identity API เพื่อใช้ OAuth2

เริ่มต้นใช้งาน

เริ่มต้นด้วยการสร้างไดเรกทอรีและไฟล์เริ่มต้นต่อไปนี้

manifest.json

เพิ่มไฟล์ Manifest โดยสร้างไฟล์ชื่อ manifest.json แล้วใส่โค้ดต่อไปนี้

{
  "name": "OAuth Tutorial FriendBlock",
  "version": "1.0",
  "description": "Uses OAuth to connect to Google's People API and display contacts photos.",
  "manifest_version": 3,
  "action": {
    "default_title": "FriendBlock, friends face's in a block."
  },
  "background": {
    "service_worker": "service-worker.js"
  }
}

service-worker.js

เพิ่ม Service Worker ของส่วนขยายโดยสร้างไฟล์ชื่อ service-worker.js และใส่โค้ดต่อไปนี้

chrome.action.onClicked.addListener(function() {
  chrome.tabs.create({url: 'index.html'});
});

index.html

เพิ่มไฟล์ HTML ชื่อ index.html และใส่โค้ดต่อไปนี้

<html>
  <head>
    <title>FriendBlock</title>
    <style>
      button {
        padding: 10px;
        background-color: #3C79F8;
        display: inline-block;
      }
    </style>
  </head>
  <body>
    <button>FriendBlock Contacts</button>
    <div id="friendDiv"></div>
  </body>
</html>

รักษารหัสส่วนขยายให้สอดคล้องกัน

การคงรหัสเดียวไว้เป็นสิ่งสำคัญในระหว่างการพัฒนา หากต้องการรักษารหัสให้สอดคล้องกัน ให้ทำตามขั้นตอนต่อไปนี้

อัปโหลดส่วนขยายไปยังแดชบอร์ดสำหรับนักพัฒนาแอป

แพ็กเกจไดเรกทอรีส่วนขยายเป็นไฟล์ .zip แล้วอัปโหลดไปยังแดชบอร์ดนักพัฒนาแอป Chrome โดยไม่ต้องเผยแพร่

  1. ในแดชบอร์ดนักพัฒนาแอป ให้คลิกเพิ่มรายการใหม่
  2. คลิกเรียกดูไฟล์ เลือกไฟล์ ZIP ของส่วนขยาย แล้วอัปโหลด
  3. ไปที่แท็บแพ็กเกจ แล้วคลิกดูคีย์สาธารณะ
ปุ่มดูคีย์สาธารณะในแท็บแพ็กเกจ
ปุ่มดูคีย์สาธารณะในแท็บแพ็กเกจ

เมื่อกล่องโต้ตอบเปิดขึ้น ให้ทำตามขั้นตอนต่อไปนี้

  1. คัดลอกโค้ดระหว่าง -----BEGIN PUBLIC KEY----- กับ -----END PUBLIC KEY-----
  2. นำบรรทัดใหม่เพื่อทำให้เป็นข้อความบรรทัดเดียว
หน้าต่างกล่องโต้ตอบคีย์สาธารณะ
หน้าต่างกล่องโต้ตอบคีย์สาธารณะ

เพิ่มโค้ดลงใน manifest.json ในช่อง "key" วิธีนี้จะทำให้ส่วนขยายใช้รหัสเดียวกัน

{ // manifest.json
  "manifest_version": 3,
...
  "key": "ThisKeyIsGoingToBeVeryLong/go8GGC2u3UD9WI3MkmBgyiDPP2OreImEQhPvwpliioUMJmERZK3zPAx72z8MDvGp7Fx7ZlzuZpL4yyp4zXBI+MUhFGoqEh32oYnm4qkS4JpjWva5Ktn4YpAWxd4pSCVs8I4MZms20+yx5OlnlmWQEwQiiIwPPwG1e1jRw0Ak5duPpE3uysVGZXkGhC5FyOFM+oVXwc1kMqrrKnQiMJ3lgh59LjkX4z1cDNX3MomyUMJ+I+DaWC2VdHggB74BNANSd+zkPQeNKg3o7FetlDJya1bk8ofdNBARxHFMBtMXu/ONfCT3Q2kCY9gZDRktmNRiHG/1cXhkIcN1RWrbsCkwIDAQAB",
}

เปรียบเทียบรหัส

เปิดหน้าการจัดการส่วนขยายที่ chrome://extensions ตรวจสอบว่าได้เปิดใช้โหมดนักพัฒนาซอฟต์แวร์แล้ว และอัปโหลดไดเรกทอรีส่วนขยายที่ไม่ได้แพ็ก เปรียบเทียบรหัสส่วนขยายในหน้าการจัดการส่วนขยาย กับรหัสสินค้าในแดชบอร์ดสำหรับนักพัฒนาแอป โดยควรตรงกัน

รหัสของ
การจับคู่ส่วนขยาย

สร้างรหัสไคลเอ็นต์ OAuth

แอปพลิเคชันที่ใช้ OAuth 2.0 เพื่อเข้าถึง Google APIs ต้องมี ข้อมูลเข้าสู่ระบบการให้สิทธิ์ที่ระบุแอปพลิเคชันไปยังเซิร์ฟเวอร์ OAuth 2.0 ของ Google ขั้นตอนต่อไปนี้จะอธิบายวิธีสร้างข้อมูลเข้าสู่ระบบสำหรับโปรเจ็กต์ จากนั้นแอปพลิเคชันจะใช้ข้อมูลเข้าสู่ระบบเพื่อเข้าถึง API ที่คุณเปิดใช้สำหรับโปรเจ็กต์นั้นได้

เริ่มต้นด้วยการไปที่คอนโซล Google API เพื่อสร้าง โปรเจ็กต์ใหม่หากยังไม่มี ทําตามวิธีการต่อไปนี้เพื่อ สร้างไคลเอ็นต์ OAuth และรับรหัสไคลเอ็นต์

  1. Go to the Clients page.
  2. คลิกสร้างไคลเอ็นต์
  3. เลือกประเภทแอปพลิเคชันส่วนขยาย Chrome
  4. ป้อนชื่อสำหรับไคลเอ็นต์ OAuth ชื่อนี้จะแสดงใน หน้าไคลเอ็นต์ ของโปรเจ็กต์เพื่อระบุไคลเอ็นต์
  5. ป้อนรหัสส่วนขยายในช่องรหัสสินค้า
  6. คลิกสร้าง

ลงทะเบียน OAuth ในไฟล์ Manifest

ใส่ฟิลด์ "oauth2" ในไฟล์ Manifest ของส่วนขยาย วางรหัสไคลเอ็นต์ OAuth ที่สร้างขึ้นไว้ใต้ "client_id" ใส่สตริงว่างใน "scopes" ไว้ก่อน

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes":[""]
  },
  ...
}

เริ่มขั้นตอน OAuth แรก

ลงทะเบียนสิทธิ์ identity ในไฟล์ Manifest

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "permissions": [
    "identity"
  ],
  ...
}

สร้างไฟล์เพื่อจัดการโฟลว์ OAuth ชื่อ oauth.js และใส่โค้ดต่อไปนี้

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      console.log(token);
    });
  });
};

วางแท็กสคริปต์สำหรับ oauth.js ในส่วนหัวของ index.html

...
  <head>
    <title>FriendBlock</title>
    ...
    <script type="text/javascript" src="oauth.js"></script>
  </head>
...

โหลดส่วนขยายซ้ำ แล้วคลิกไอคอนเบราว์เซอร์เพื่อเปิด index.html เปิดคอนโซลแล้วคลิกปุ่ม "FriendBlock Contacts" โทเค็น OAuth จะปรากฏในคอนโซล

ดูโทเค็นในคอนโซล

เปิดใช้ Google People API

กลับไปที่คอนโซล Google API แล้วเลือกคลังจากแถบด้านข้าง ค้นหา "Google People API" คลิกผลการค้นหาที่ถูกต้อง แล้วเปิดใช้

เปิดใช้ People API

เพิ่มไลบรารีของไคลเอ็นต์ Google People API ลงใน "scopes" ในไฟล์ Manifest ของส่วนขยาย

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/contacts.readonly"
    ]
  },
  ...
}

กลับไปที่คอนโซล Google API แล้วกลับไปที่ข้อมูลเข้าสู่ระบบ คลิก "สร้างข้อมูลเข้าสู่ระบบ" แล้วเลือก "คีย์ API" จากเมนูแบบเลื่อนลง

สร้างข้อมูลเข้าสู่ระบบ People API

เก็บคีย์ API ที่สร้างขึ้นไว้เพื่อใช้ในภายหลัง

สร้างคำขอ API แรก

ตอนนี้ส่วนขยายมีสิทธิ์ ข้อมูลเข้าสู่ระบบ และสามารถให้สิทธิ์ผู้ใช้ Google ได้แล้ว จึงสามารถ ขอข้อมูลผ่าน People API ได้ อัปเดตโค้ดใน oauth.js ให้ตรงกับโค้ดด้านล่าง

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY',
          init)
          .then((response) => response.json())
          .then(function(data) {
            console.log(data)
          });
    });
  });
};

แทนที่ API_KEY ด้วยคีย์ API ที่สร้างจากคอนโซล Google API ส่วนขยายควรบันทึกออบเจ็กต์ JSON ที่มีอาร์เรย์ของ people/account_id ภายใต้ฟิลด์ memberResourceNames

บล็อกใบหน้า

เมื่อส่วนขยายแสดงรายชื่อติดต่อของผู้ใช้แล้ว ก็จะส่งคำขอเพิ่มเติมเพื่อดึงโปรไฟล์และข้อมูลของรายชื่อติดต่อเหล่านั้นได้ ส่วนขยายจะใช้ memberResourceNames เพื่อดึงข้อมูลรูปภาพของรายชื่อติดต่อของผู้ใช้ อัปเดต oauth.js เป็น รวมโค้ดต่อไปนี้

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=<API_Key_Here>',
          init)
          .then((response) => response.json())
          .then(function(data) {
            let photoDiv = document.querySelector('#friendDiv');
            let returnedContacts = data.memberResourceNames;
            for (let i = 0; i < returnedContacts.length; i++) {
              fetch(
                  'https://people.googleapis.com/v1/' + returnedContacts[i] +
                      '?personFields=photos&key=API_KEY',
                  init)
                  .then((response) => response.json())
                  .then(function(data) {
                    let profileImg = document.createElement('img');
                    profileImg.src = data.photos[0].url;
                    photoDiv.appendChild(profileImg);
                  });
            };
          });
    });
  });
};

โหลดซ้ำและกลับไปที่ส่วนขยาย คลิกปุ่ม FriendBlock แล้วก็เสร็จเรียบร้อย เพลิดเพลินกับใบหน้าของบุคคลใน บล็อก

ติดต่อบุคคลในบล็อก