用 Google 的 OpenID Connect 做身分驗證

用 Google 的 OpenID Connect 做身分驗證

只要B2B的對外服務,若不能建置VPN來確保來源端,要避免防暴力破解、密碼外洩風險等成本高又容易出錯的帳號密碼系統,最簡單省事安全的做法之一應該就是把「身分驗證」委託給 Google,我們只要負責決定「誰能進來」就好了。

事前準備

首先要先去申請到的 Client ID 與 Client Secret,這是你的網站的身分,外部使用者完全不需要、也看不到這兩個值。

  1. 前往 Google Cloud Console 的「API 與服務 → 憑證」
  2. 點「建立憑證 → OAuth 用戶端 ID」
  3. 應用程式類型選「網頁應用程式」(不要選「電腦/桌面」類型,桌面類型無法設定 Web 用的重新導向 URI)
  4. 建立後取得 用戶端 ID 與 用戶端密鑰,然後就可以丟給AI去幫你生成程式跟網站了

在「已授權的重新導向 URI」填入回呼網址,本機開發為:

http://localhost:5000/auth/callback

要特別注意:Google 會把 localhost 與 127.0.0.1 視為不同字串,不會自動互通。因此測試時要用瀏覽器開 http://localhost:5000,而不是 127.0.0.1 或 0.0.0.0否則程式產生的 redirect_uri 會與登記值不符而被擋。

在程式內把設定完成後,就可以快速來驗證一下對不對了

因為我有啟動二階段驗證,所以會多一道手續來確認,但看到這個畫面代表我們前面的設定沒有問題

如此一來就進到畫面了

完整登入流程

  1. 使用者點「用 Google 登入」,程式導向 Google 授權頁
  2. 使用者在 Google 官方頁面完成驗證(可能包含二階段驗證)
  3. Google 帶著授權碼回呼到 /auth/callback
  4. Authlib 用授權碼換取 token,並解析出已驗證的 userinfo(email、name)
  5. 程式以 email 比對白名單,在名單內建立 session 放行,否則回 403 拒絕頁

小結

Google OpenID Connect 驗證身分 + 白名單授權」是內部工具相當理想的組合,把最容易出錯、風險最高的密碼管理交給 Google,我們只要專注在「誰能進來」這件事情上,整體程式碼非常精簡,卻能得到企業級的登入安全控管 😛。