前面講了很多密碼相關的主題,但說穿了,要填密碼本身就是很麻煩的事,一方面容易忘記,一方面也會擔心網站是否安全,這時候一些值得信任的第三方登入就會是很方便的選擇。
OAuth 2.0 是一個授權框架(不是認證框架),它讓第三方應用程式可以在使用者授權下,存取使用者在其他服務(如 Google、Facebook)上的資源,而不需要知道使用者的密碼。
為什麼要用授權碼再換 Token,而不是直接給 Token?因為授權碼是透過前端瀏覽器傳遞的(不安全),而換 Token 的動作是在後端伺服器進行的(安全),這樣可以避免 Token 被攔截。
💡 提示:專案就像是一個容器,可以把相關的 API 和憑證都放在裡面管理。
為什麼要啟用 Gmail API?因為我們要透過這個 API 取得使用者的基本資料(姓名、Email 等)。
⚠️ 注意:如果你的專案要取得使用者的 Email,一定要啟用這個 API,否則會拿不到資料!
這個步驟是設定當使用者要授權時,會看到什麼資訊。
💡 說明:「外部」表示任何有 Google 帳號的人都可以登入;「內部」只限組織內的人使用。
這邊要填的東西有點多,但大部分都是必填的:
應用程式資訊
我的網站
(會顯示給使用者看)應用程式標誌(選填)
應用程式網域(選填)
http://localhost:3000
已授權網域(選填)
開發人員聯絡資訊
點「儲存並繼續」
範圍就是你要跟使用者要哪些權限。
點「新增或移除範圍」
選擇以下範圍:
.../auth/userinfo.email
- 取得 Email.../auth/userinfo.profile
- 取得基本資料(姓名、頭像)點「更新」,然後「儲存並繼續」
如果你的應用程式還在測試階段,可以加入測試使用者的 Email。但我們現在先跳過,直接點「儲存並繼續」。
檢查一下設定,沒問題就完成了!
終於來到最後一步了!我們要建立 OAuth 2.0 的用戶端 ID 和密鑰。
我的網站 OAuth 用戶端
(隨便取)這是最重要的一步!Google 會檢查你的 callback URL 是否在這個清單裡。
點「新增 URI」,輸入:
http://localhost:3000/auth/google/callback
這個 URI 要跟你程式裡設定的完全一樣,包括:
- 協定(http/https)
- 網域
- Port
- 路徑
如果不一樣,Google 會直接拒絕你,然後你會看到
redirect_uri_mismatch
錯誤
建立完成後會跳出一個視窗,裡面有兩個重要的東西:
把這兩個東西複製起來! 待會要用。
如果不小心關掉視窗,別擔心!可以在憑證列表裡找到,點進去就能看到了。
把剛剛複製的憑證加到 .env
檔案:
# Google OAuth 設定
GOOGLE_CLIENT_ID=你的用戶端編號
GOOGLE_CLIENT_SECRET=你的用戶端密碼
GOOGLE_CALLBACK_URL=http://localhost:3000/auth/google/callback
# 前端網址(之後會用到)
FRONTEND_URL=http://localhost:3001
同時也要更新 .env.example
:
# Google OAuth 設定
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_CALLBACK_URL=http://localhost:3000/auth/google/callback
# 前端網址
FRONTEND_URL=http://localhost:3001
絕對不要把
.env
檔案提交到 Git!確保.gitignore
有包含.env
。
雖然我們還沒寫 code,但可以先用一個簡單的方法測試 Google OAuth 設定是否正確。
Google 提供了一個測試工具:OAuth 2.0 Playground
如果設定正確,應該會跳出 Google 授權畫面