OAuth 2.0:透過 Google 驗證使用者

OAuth2 是授權的業界標準通訊協定。這項機制可讓使用者授予網頁和電腦應用程式存取私人資訊的權限,而無須分享使用者名稱、密碼和其他私人憑證。

本教學課程會建立擴充功能,使用 Google People APIChrome Identity API 存取使用者的 Google 聯絡人。由於擴充功能不會透過 HTTPS 載入,因此無法執行重新導向或設定 Cookie,因此必須仰賴 Chrome Identity API 才能使用 OAuth2。

開始使用

首先建立目錄和下列初始檔案。

manifest.json

建立名為 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.js 的檔案,並加入下列程式碼,即可新增擴充功能服務 worker。

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

index.html

新增名為 index.html 的 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> 

保持一致的擴充功能 ID

在開發過程中,保留單一 ID 非常重要。如要保持 ID 一致,請按照下列步驟操作:

將擴充功能上傳至開發人員資訊主頁

將擴充功能目錄封裝成 .zip 檔案,然後上傳至 Chrome 開發人員資訊主頁,但不要發布:

  1. 在開發人員資訊主頁上,按一下「新增項目」
  2. 按一下「瀏覽檔案」,選取擴充功能的 ZIP 檔案並上傳。
  3. 前往「Package」分頁,然後點選「View public key」
「Package」分頁中的「View public key」按鈕
「Package」分頁中的「View public key」按鈕

對話方塊開啟後,請按照下列步驟操作:

  1. 複製 -----BEGIN PUBLIC KEY----------END PUBLIC KEY----- 之間的程式碼。
  2. 移除換行符號,將其改為單行文字。
公開金鑰對話方塊視窗
公開金鑰對話方塊視窗

將程式碼新增至 "key" 欄位下的 manifest.json。這樣擴充功能就會使用相同的 ID。

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

比較 ID

開啟 chrome://extensions 中的「Extensions Management」頁面,確認已啟用「Developer mode」,然後上傳未封裝的擴充功能目錄。將擴充功能管理頁面中的擴充功能 ID 與開發人員資訊主頁中的商品 ID 進行比較。兩者應相符。

擴充功能比對的 ID

建立 OAuth 用戶端 ID

前往 Google API 控制台,然後建立新專案。準備就緒後,請選取側欄中的「憑證」,然後按一下「建立憑證」,並選擇「OAuth 用戶端 ID」

建立擴充功能的憑證

在「Create client ID」(建立用戶端 ID) 頁面中選取「Chrome 擴充功能」。填入擴充功能名稱,並在「應用程式 ID」欄位的網址結尾處放入擴充功能 ID。

填寫擴充功能資訊

按一下「建立」即可完成。主控台會提供 OAuth 用戶端 ID。

在資訊清單中註冊 OAuth

在擴充功能資訊清單中加入 "oauth2" 欄位。將產生的 OAuth 用戶端 ID 放在 "client_id" 下方。目前請在 "scopes" 中加入空字串。

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

啟動第一個 OAuth 流程

在資訊清單中註冊 identity 權限。

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

建立名為 oauth.js 的檔案,用於管理 OAuth 流程,並加入下列程式碼。

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 控制台,然後從側欄選取「Library」。搜尋「Google People API」,然後點選正確的結果並啟用。

啟用 People API

Google People API 用戶端程式庫新增至擴充功能資訊清單中的 "scopes"

{   "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 替換為 Google API 控制台產生的 API 金鑰。擴充功能應記錄 JSON 物件,其中包含 memberResourceNames 欄位下的 people/account_id 陣列。

停止顯示臉孔

擴充功能現在會傳回使用者的聯絡人清單,因此可以提出額外要求,擷取這些聯絡人的個人資料和資訊。擴充功能會使用 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」按鈕,在區塊中顯示聯絡人的臉孔。

區塊中的接觸面