氛圍學院 · 互動單元設計提案

低門檻身份驗證與第三方登入

用第三方登入快速做出安全的註冊與登入,不用自己從零管密碼。

←→ 切換章節 · 上方兩顆按鈕切換檢視 · 網址會記住你停在哪一章,可以直接分享 · 目前:互動單元 · 1/5

密碼不是功能,是負債

大部分人想到「做登入」,想的是那個表單。但表單是最簡單的部分。先看看一個真的能上線的密碼系統,你要長期養多少東西。

👆 切換下面的開關,看清單怎麼變
10 個你要自己寫、自己修、出事自己扛的東西
點任一塊看它的隱藏成本 —— 每一塊都不是寫完就結束,是要一直養的。

把流程排回正確順序

「用 Google 登入」按下去之後發生了六件事。它們現在是亂的 —— 拖動卡片,或用右邊的箭頭,把它排成正確的順序。

✋ 拖曳排序,排完按「檢查」
    關鍵洞察

    回頭看第 3 步:使用者輸入密碼的那個畫面,在 Google 的網域上,不在你的網站上。從頭到尾,使用者的密碼沒有經過你的伺服器一次。

    這就是「低門檻」的真正意思 —— 不是少寫幾行程式,是你的資料庫裡根本沒有密碼可以外洩。你把風險移走了,不是把風險藏起來。

    改一個字,登入就壞了

    第 4 步裡 Google 要「把使用者導回你的網站」。它不會亂導 —— 只導到你事先登記過的網址。而它的比對方式是一字不差的字串比對。

    ⌨️ 改右邊那行,看下面的畫面即時反應

    Google Cloud Console

    你事先登記的網址(不可改)
    https://myapp.com/auth/callback

    你的程式碼

    送出去的 redirect_uri(可以改)
    試試只差 https 試試多一個斜線 填成正確的
    accounts.google.com/o/oauth2/auth?...
    🚫
    錯誤 400:redirect_uri_mismatch
    你送出的網址跟登記的不一樣,Google 拒絕繼續。
    關鍵洞察

    這不是 Google 龜毛。如果它願意「差不多就好」,攻擊者就能登記一個像你的網址,把使用者的授權碼導到自己手上 —— 這條規則嚴格,是因為它在擋人。

    順帶一提:這是新手第一天最常卡住的地方。看到 redirect_uri_mismatch,永遠先去逐字比對這兩個字串,不要去改程式邏輯。

    這個可以放在前端嗎?

    前端的程式碼,任何人按 F12 都看得到 —— 包含你以為藏起來的環境變數。下面四樣東西在流程裡都會出現,判斷一下它們能不能出現在瀏覽器裡。

    🤔 每張卡選一邊,馬上知道對不對
    關鍵洞察

    分辨方法很簡單:問「這東西是用來宣告我是誰,還是用來證明我是我?」宣告身分的(client_id、redirect_uri)本來就會公開;用來證明的(client_secret、token)進了前端就等於送出去。

    所以流程的第 5 步 —— 拿 code 去換 token —— 一定發生在你的後端。整個 OAuth 的設計,就是繞著這一條線在切。

    同一個人,還是兩個人?

    Amy 週一用 Google 登入你的網站。週三她忘了,改點 GitHub 登入 —— 兩邊的 email 都是 amy@gmail.com。你的資料庫該怎麼認?

    🧩 選一個做法,看它三個月後長什麼樣
    關鍵洞察

    email 不能當身分。使用者會改 email、有些平台根本不給你 email、還有平台給的是每次都不同的轉發地址。唯一穩定的識別是 provider 給的那組 ID(Google 叫它 sub)。

    正確做法是兩張表:一張 users 是「人」,一張 identities 是「這個人有哪些登入方式」,一對多。要合併帳號時,讓使用者在已登入狀態下主動綁定第二個 provider —— 而不是你在後端偷偷憑 email 幫他合併。

    這個單元你帶走了什麼

    • 第三方登入省的不是程式碼,是你資料庫裡不會有密碼可以外洩
    • 使用者輸入密碼的畫面在 provider 的網域,永遠不在你的網站上
    • redirect_uri 是逐字比對,差一個斜線就會擋下來 —— 而它擋的是攻擊者
    • client_secret 和 token 只能待在後端;client_id 本來就是公開的
    • 用 provider + sub 認人,不要用 email;帳號合併要使用者自己來
    設計提案說明 · 非學員內容

    設計者的框架:HCI × HITL × AI/UX

    這個單元不是單點發想。它落在我三條長期主張的交會處 —— 三條線各自解決互動教材的一個失敗模式,少一條就會做出「好玩、但學完帶不走判斷力」的東西。

    HCI

    互動不是裝飾,是心智模型的施工方法

    學習的瓶頸從來不是資訊量,是學員腦中有沒有一個能自己往下推演的模型。HCI 給的核心啟示是:回饋延遲愈短,因果連結愈強。所以我不把互動放在「講完之後練習」的位置,而是放在「概念還沒講之前」—— 先讓他動手撞到牆,解釋才有地方掛。

    在這個單元裡的落點 Step 2 排序題逼出因果鏈 —— 選擇題可以猜,排序不行 · Step 3 把 debug 的回饋延遲,從「查半天 Stack Overflow」壓到 0.1 秒
    HITL

    「低門檻」的陷阱,是迴圈裡沒有人了

    AI 十分鐘就能接好 OAuth,門檻確實降了 —— 但如果沒人看得懂那段程式碼、出事沒人知道往哪裡找,那不是低門檻,是把人踢出了迴圈。所以這個單元的目標不是教他寫,是讓他有資格當那個 human in the loop:能驗收、能定位錯誤、能說出邊界在哪。

    而這個主題剛好給了一個罕見的雙層對位 —— 教學層的 HITL 和產品層的 HITL 是同一個動作。

    在這個單元裡的落點 Step 4 給的是判斷法則(宣告身分 vs 證明身分),讓他能判斷沒教過的第五個東西 · Step 5 產品層的 HITL:帳號合併不能讓後端憑 email 替使用者決定,要她在已登入狀態下自己綁 —— 同一堂課裡,學員一邊在學怎麼當迴圈裡的人,一邊在學不要把自己的使用者踢出迴圈
    AI/UX

    安全規則要講「它在擋誰」,不能只講「規定如此」

    我在講座與專欄裡一貫主張的是揭露與問責:一份產出要能說清楚誰供料、模型做了什麼、誰核准、哪些結論不能外推。搬到教學上就是 —— 每一條安全規則都必須附上它的攻擊情境。不解釋動機的規則,學員會當成 AI 的怪癖繞過去;解釋了,他才會在 AI 給出一段繞過它的程式碼時停下來。

    在這個單元裡的落點 Step 1 誠實標註「第三方登入把責任外包,不是消滅責任」 · Step 3 逐字比對是在擋網址劫持 · Step 4 secret 進前端等於把鑰匙交出去 · Step 5 用未驗證 email 自動合併=帳號接管漏洞
    三條線收在同一句話上:低門檻不該等於低判斷力。門檻可以交給 AI 降,判斷力必須是課程給的 —— 這也是我認同氛圍學院「才有能力驗收 AI、修正 AI」這個定位的原因。
    設計提案說明 · 非學員內容

    五步的設計邏輯

    單元在世界地圖上的位置是「已經做得出畫面、開始要碰真實使用者」。學員的痛點不是不會接 SDK(AI 十分鐘就幫他接好了),是接完之後看不懂它在幹嘛、出錯時不知道往哪裡找。所以目標不是「教會他寫 OAuth」,是建立一組能拿去驗收 AI 產出的判斷力。

    • 1 動機在前,知識在後。先讓他親眼看到「自己做要養十樣東西」的重量,第三方登入才有意義。直接從 OAuth 講起,學員沒有動機接住它。
    • 2 排序題強迫建立心智模型。排序是唯一逼學員在腦中形成因果鏈的互動形式 —— 選擇題可以猜,排序不行。每張卡標了「誰在做」(你/Google/使用者),排完那個「密碼從沒經過我」的洞察就是他自己發現的,不是被告知的。
    • 3 挑真實會踩的坑,不挑好教的坑。redirect_uri_mismatch 是這個主題的第一名求助關鍵字。改一個字元、畫面立刻變紅並指出差在哪 —— 這是「即時回饋」最該用在的地方:把 debug 的因果關係壓縮到 0.1 秒。
    • 4 給的是判斷法則,不是記憶清單。四張卡答完之後給的是「宣告身分 vs 證明身分」這條分辨規則,學員下次遇到沒教過的第五個東西也能自己判斷。
    • 5 留一個轉折。學員在第 4 步會以為單元結束了,第 5 步把他推進真實產品才會遇到的問題。這一步的功能是讓他知道自己還不知道什麼 —— 這比多教一個知識點更能建立長期信任。
    設計提案說明 · 非學員內容

    三個貫穿全篇的原則

    這三條不是這個單元專用的。它們是我做任何一堂互動課都會先立的規矩,也是我判斷別人的課有沒有效時實際在看的東西。

    • 誠實優先於漂亮。第 1 步結尾特地說明「它不是 0」。課程如果只賣輕鬆,學員上線那天會恨你。誠實的邊界說明是留存率的來源,不是掃興。
    • 每個安全規則都要解釋「它在擋誰」。不解釋動機的規則會被學員當成 AI 的怪癖繞過去。第 3、4 步都補上了攻擊情境。
    • 互動要有唯一解且能自動判對錯。沒有「自由發揮」的互動 —— 每一步都能在 0.1 秒內給出對/錯與原因,這才是互動式教材相對於影片的真正優勢。做不到自動判對錯的題目,就不該做成互動。
    設計提案說明 · 非學員內容

    還沒做進去的(若要正式產出)

    這是一份為徵才表單製作的提案,不是可上架的成品。以下是我知道還缺什麼 —— 我認為「說得出自己漏了什麼」比多做一個功能更能說明專業程度。

    • AI 助教的接入點:第 3 步錯誤畫面旁應該有「問助教為什麼」,把錯誤上下文直接餵進去。
    • 學習成效追蹤:第 2 步的排序錯誤模式(哪兩張最常排反)是很強的教材迭代訊號,值得埋事件。
    • 行動版:排序在手機上要換成點選交換,拖曳體感在小螢幕會掉。
    • 簡化的地方(有意為之,需標註):第 2 步的流程是 authorization code flow,前端應用實務上會改用 PKCE、不帶 client_secret。這一層對本單元的學員是雜訊,但正式版應在延伸閱讀補一句,避免他去查資料時對不上。
    • 延伸單元的接點:session 與 JWT、token 過期與 refresh、多裝置登出、PKCE。