什麼係 OAuth?「用 Google 登入」同委派存取解說
OAuth 係一個開放標準,等用戶俾一個 app 喺另一個服務上嘅帳戶有限度嘅存取權,而唔使俾出密碼。當你撳「連接 Google 行事曆」,然後見到一個問「允許呢個 app 睇你嘅活動嗎?」嘅畫面,嗰個就係 OAuth。App 只會攞到一個 token,權限只限於你批准嘅嘢,而你隨時可以撤銷。加上一層叫 OpenID Connect 嘅機制之後,同一套機制亦都係「用 Google 登入」同類按鈕背後嘅核心。
用 AI 建 app 時點解 OAuth 重要
建 app 嘅時候,OAuth 通常會喺兩種情況出現:
- 社交登入。 你想俾用戶用「Google 登入」(或者 Apple、Microsoft、GitHub)代替再開一個新密碼。睇吓點樣為你 app 加入登入。
- 連接用戶喺其他服務上嘅帳戶。 你個 app 需要讀取用戶嘅行事曆、代表佢喺社交帳戶發佈嘢、由雲端硬碟攞檔案,或者同步佢哋嘅會計資料。
喺兩種情況下,你嘅 AI builder 都可以寫程式碼,但有啲步驟只可以由你自己做:喺服務商度建立開發者 app、攞到 client ID 同 client secret、登記回調網址,而某啲權限仲要通過服務商嘅審核。明白 OAuth 點運作,會令呢啲步驟——以及佢哋產生嘅錯誤——唔再咁神秘。想睇登入嘅整體圖景,可以睇什麼係身份驗證。
日常比喻
諗吓酒店嘅房卡。入住時,前檯確認你係邊個,然後俾你一張卡,可以開你嘅房同健身室——唔可以開其他房,亦唔可以入員工區——而且退房之後就失效。張卡唔載有你嘅護照。如果你遺失咗佢,前檯會取消佢,再發一張新嘅。
- 前檯就係授權伺服器(Google 嘅登入頁面)。
- 你嘅身份核對就係你喺 Google 登入。
- 房卡就係 access token。
- **「只限房間同健身室」**就係你批准嘅 scope。
- 退房就係 token 過期,或者你撤銷存取權。
你正在用嘅 app 永遠唔會見到你嘅 Google 密碼,佢只會見到張房卡。
OAuth 點運作,逐步睇
網頁 app 最常見嘅流程係 authorization code flow(授權碼流程)。以下係用戶將 Google 行事曆連接到一個排程 app 時發生嘅事:
- 撳一下。 用戶撳「連接 Google 行事曆」。
- 重新導向去服務商。 App 將瀏覽器送去 Google,附上佢嘅 client ID、想要嘅 scope(讀取行事曆活動),以及 Google 完成後應該將用戶送返去嘅 redirect URI。
- 登入同同意。 用戶登入 Google(如果未登入),並且見到一個同意畫面,列出 app 要求咩。佢哋撳 Allow。
- 帶住 code 返回。 Google 將瀏覽器重新導向去 app 嘅 redirect URI,附上一個短時效、一次性嘅 authorization code。
- 喺伺服器交換。 App 嘅伺服器將嗰個 code 連同 client secret 直接送去 Google,然後收到一個 access token(通常亦有 refresh token)。
- 使用 API。 伺服器用 access token 調用 Google 行事曆 API,攞到用戶嘅活動。
第 4 步嘅回調大概係咁樣:
https://yourapp.com/auth/google/callback?code=4/0Adeu5B...&state=x7Kq9
第 5 步嘅 token 回應係 JSON,大概係咁:
{
"access_token": "ya29.a0Af...",
"expires_in": 3599,
"refresh_token": "1//0gL...",
"scope": "https://www.googleapis.com/auth/calendar.readonly",
"token_type": "Bearer"
}
設計上嘅重點:token 交換係伺服器對伺服器進行,所以 client secret 同 token 永遠唔使經過瀏覽器。
OAuth vs OpenID Connect vs 你自己嘅登入
| 回答咩問題 | 例子 | |
|---|---|---|
| OAuth 2.0 | 「呢個 app 可以代表用戶做咩?」(授權) | 讀取用戶嘅行事曆 |
| OpenID Connect(OIDC) | 「呢個用戶係邊個?」(身份驗證),建基於 OAuth 之上 | 「用 Google 登入」返回一個已驗證嘅電郵 |
| 你自己嘅登入 | 「呢個密碼係咪呢個帳戶嘅正確密碼?」 | 喺你嘅資料庫入面儲存(已雜湊)嘅電郵同密碼 |
好多 app 會將佢哋結合:電郵加密碼登入,加上透過 OIDC 嘅「用 Google 登入」,再加上獨立嘅 OAuth 連接去其他服務。
主要術語
| 術語 | 意思 |
|---|---|
| 服務商/授權伺服器(Provider / authorization server) | 用戶登入同批准存取嘅服務,例如 Google、Microsoft、GitHub。 |
| 客戶端(Client) | 你嘅 app,向服務商登記嘅身份。 |
| Client ID | 你 app 喺服務商嗰度嘅公開識別碼。 |
| Client secret | 你 app 喺服務商嗰度嘅私人密碼。只限伺服器。 |
| Scope(權限範圍) | 一項具體權限,例如「讀取行事曆」或者「查看電郵地址」。 |
| 同意畫面(Consent screen) | 用戶睇到同批准所要求 scope 嘅頁面。 |
| Redirect URI/回調網址 | 服務商將用戶送返去嘅地方。必須事先登記,並且完全一致。 |
| Access token | 用嚟調用 API 嘅短時效憑證。 |
| Refresh token | 用嚟攞新 access token 嘅較長效憑證。要當作密碼一樣保管。 |
| ID token | OIDC 入面,一個描述用戶身份嘅已簽署 token。 |
| PKCE | 一項額外檢查(「proof key」),防止被截取嘅 code 被人使用。建議所有客戶端都用。 |
| state | 一個隨機值,保護整個流程免受偽造請求。 |
常見誤解
- 「OAuth 係一個登入系統。」 純 OAuth 只係授予存取;身份由 OpenID Connect 處理。將一個 access token 當成某人身份嘅證明,曾經造成真正嘅安全漏洞。
- 「個 app 會攞到我嘅密碼。」 佢永遠唔會。呢個就係設計重點。
- 「多要求 scope 無傷。」 用戶對過於廣泛嘅要求會更加提防,而 Google 等服務商可能要求敏感或者受限 scope 嘅 app 要通過審核。只要求你真正需要嘅嘢。
- 「Client secret 可以放喺前端。」 任何放喺瀏覽器程式碼入面嘅嘢都係公開嘅。要放喺伺服器端秘密資料入面。
- 「測試時行得通,所以上線都會行得通。」 服務商通常會限制未經審核嘅 app,例如只限列明嘅測試用戶;而你正式網域嘅重新導向網址需要另外登記。
- 「Token 會永遠有效。」 Access token 好快就過期,而用戶亦可以撤銷存取權。你嘅 app 要能夠妥善處理兩種情況。
你可以叫 AI builder 做咩
- 「用「Google 登入」,採用 OpenID Connect,並使用一個維護良好嘅身份驗證函式庫——唔好自己手寫 OAuth 流程。」
- 「使用 PKCE 嘅 authorization code flow,並檢查
state參數。」 - 「client ID 同 client secret 要喺伺服器上由環境變數讀取。」
- 「只要求我哋需要嘅 scope:唯讀行事曆存取。」
- 「列出我需要喺服務商控制台登記嘅每一個重新導向網址,包括預覽、已發佈網址同我嘅自訂網域。」
- 「將 refresh token 加密後儲存喺資料庫,並且遇到過期或者被撤銷嘅 token 時,請用戶重新連接。」
- 「俾用戶喺設定頁面中斷連接呢個整合。」
OAuth 同 Mythex
Mythex 冇內建俾終端用戶登入你建嘅 app;佢嘅文件描述嘅係「自帶身份驗證」(bring-your-own)方式:你揀一個身份驗證函式庫或者託管服務商,將佢哋嘅 key 儲存為項目秘密資料,然後 agent 負責寫程式碼。加入身份驗證食譜有一個起始提示可以用。你亦會喺 Mythex 本身遇到 OAuth:你可以用 Google 註冊,連接 GitHub 做倉庫同步就用到 GitHub OAuth,而透過 MCP 連接去 Mythex 嘅 AI 客戶端,都會經過一個 OAuth 同意頁面。想了解多啲,可以睇什麼係身份驗證同什麼係兩步驟驗證。
常見問題
簡單嚟講,什麼係 OAuth?
OAuth 係一種標準方式,等用戶可以俾一個 app 存取佢喺另一個服務上嘅帳戶——例如俾一個排程 app 讀取佢嘅 Google 行事曆——而唔需要俾出密碼。用戶批准具體嘅權限,app 就會收到一個 token,只可以用嚟做嗰啲批准嘅事。
OAuth 同「用 Google 登入」係一樣嘢嗎?
「用 Google 登入」建基於 OAuth 2.0 同 OpenID Connect 之上。OpenID Connect 係 OAuth 上面嘅一層,加入一個標準方式,話俾 app 知用戶係邊個。OAuth 本身係關於授予存取;OpenID Connect 就係將佢變成登入功能嘅部分。
什麼係 OAuth access token?
Access token 係 app 送去服務嘅 API 嘅一個憑證,用嚟證明佢已經獲授予存取權。佢通常有效期短,並且只限於用戶批准嘅權限範圍(scope)。如果有發出 refresh token,app 就可以攞新嘅 access token,而唔使再問用戶。
redirect_uri_mismatch 係咩意思?
即係登入時 app 送出嘅回調網址,同喺服務商開發者控制台登記嘅網址唔完全一致。請為 app 運行嘅每個地址都加入確切嘅網址——包括 https、網域、路徑同任何結尾嘅斜線。
OAuth 安全嗎?
OAuth 2.0 被廣泛使用,如果正確實施就係安全嘅:使用 PKCE 嘅 authorization code flow、確切嘅重新導向網址、state 參數,並且將 client secret 同 token 留喺伺服器。大部分問題都係因為實施時走捷徑,所以建議使用一個維護良好嘅函式庫。