第十二天已經完成 credentials.json 的讀取,並使用 Google API Client Library 建立 OAuth 2.0 用戶端。
不過,成功建立 OAuth 用戶端,不代表程式已經取得存取 Google Calendar 的權限。Google 仍需要使用者同意授權,才能讓應用程式存取行事曆資料。
因此,今天的目標是使用 generateAuthUrl() 產生 Google OAuth 2.0 授權網址,並設定 Google Calendar API 所需的存取權限,為後續的使用者授權流程做準備。
延續昨天的 src/googleAuth.js,首先建立 SCOPES 陣列,指定應用程式需要的 Google Calendar 權限。
const SCOPES = [
"https://www.googleapis.com/auth/calendar.events"
];
scope 是 OAuth 2.0 用來定義應用程式要求哪些存取權限的參數。
這裡使用的 calendar.events 允許應用程式存取及管理使用者有權操作的 Google Calendar 事件,包含讀取、新增、修改及刪除。
因為後續需要透過 Discord /add 指令建立 Google Calendar 行程,所以必須先要求對應的權限。
接著使用昨天建立的 oauth2Client,呼叫 generateAuthUrl() 產生授權網址。
const authUrl = oauth2Client.generateAuthUrl({
access_type: "offline",
scope: SCOPES
});
這裡主要設定兩個參數:
access_type: "offline":要求離線存取權限,讓應用程式有機會取得 Refresh Token,供後續更新 Access Token 使用。scope: SCOPES:指定應用程式需要向使用者要求的 Google Calendar 權限。generateAuthUrl() 會根據 OAuth 用戶端設定及上述參數,產生包含 client_id、redirect_uri、scope、response_type 等資訊的授權網址。
最後使用 console.log() 將網址輸出到終端機。
console.log("\nGoogle 授權網址:");
console.log(authUrl);

完成程式碼後,在 VS Code Terminal 執行:
node src/googleAuth.js
執行結果:
Google OAuth 2.0 用戶端建立成功
Google 授權網址:
https://accounts.google.com/o/oauth2/v2/auth?...

成功產生授權網址,代表程式已經能夠根據 OAuth 2.0 用戶端設定,建立 Google 授權請求。
不過,目前還沒有取得使用者的授權,也沒有取得 Access Token,因此尚無法直接存取 Google Calendar API。
今天主要新增三個部分:
SCOPES:設定 Google Calendar API 所需的存取權限。generateAuthUrl():根據 OAuth 設定產生 Google 授權網址。access_type: "offline":要求離線存取,為後續取得 Refresh Token 做準備。整體授權流程為:
建立 OAuth2Client → 產生授權網址 → 使用者同意授權 → 取得 Authorization Code → 交換 Access Token。
今天完成的是產生授權網址,後續才會進入實際授權及 Token 交換階段。
今天最大的收穫是理解「建立 OAuth 用戶端」與「取得使用者授權」是兩個不同的步驟。
昨天建立的 oauth2Client 主要負責設定 OAuth 驗證所需的資訊,而今天使用 generateAuthUrl(),才開始建立讓使用者授權的入口。
另外也認識到 scope 與 access_type 的差異。前者決定應用程式要求哪些權限,後者則與授權後的存取模式有關。
目前已經成功透過 Node.js 產生 Google OAuth 2.0 授權網址。下一天將繼續進行使用者授權,了解 Authorization Code 如何產生,以及它在 OAuth 2.0 流程中的作用。