OAuth2 是授權的業界標準通訊協定。這項機制可讓使用者授予網頁和電腦應用程式存取私人資訊的權限,而無須分享使用者名稱、密碼和其他私人憑證。
本教學課程會建立擴充功能,使用 Google People API 和 Chrome 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 開發人員資訊主頁,但不要發布:
- 在開發人員資訊主頁上,按一下「新增項目」。
- 按一下「瀏覽檔案」,選取擴充功能的 ZIP 檔案並上傳。
- 前往「Package」分頁,然後點選「View public key」。

對話方塊開啟後,請按照下列步驟操作:
- 複製
-----BEGIN PUBLIC KEY-----
和-----END PUBLIC KEY-----
之間的程式碼。 - 移除換行符號,將其改為單行文字。

將程式碼新增至 "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 進行比較。兩者應相符。
建立 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」,然後點選正確的結果並啟用。
將 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 金鑰」。
保留產生的 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」按鈕,在區塊中顯示聯絡人的臉孔。