以你的身分:OAuth
上一堂那顆「我要跟」已經能把票寫進 Notion——但你去看那張表,沒有任何一格指向你這個人。今天你要自己出面授權一次,讓同一顆按鈕以你本人的名義寫進去(上一堂還沒接上的人不用補,今天一段就到位)。而在按下「允許」之前,你會第一次真正看懂那個勾選畫面在問你什麼。
開始之前 · 30 秒
- 今天改的還是你上一堂那個檔案,全程看本機就好,最後交作業時再一起 push
- 確認你登得進公司的 Notion——等一下要用它來授權
- 手邊留一個記事本或空白對話框,等一下有一串識別碼要暫放
- 按一下你頁面的「我要跟」,再看 跟團紀錄表有沒有多出你那一筆——有=第 05 節走 Prompt A;沒有=走 Prompt A0(一段直接到位,不用回頭補上一堂)
本堂材料 · 下面的 Prompt 都已經幫你填好了,這裡是備查
| ① 授權連結 | vibe-course.mixxin.tw/oauth/start 點下去就會被帶到 Notion 的授權畫面 |
| ② 以本人身分投票的網址 | https://vibe-course.mixxin.tw/api/join-as-me比上一堂那個 /api/join 多了 -as-me |
上一堂最後我們留了一句話:「那張表上每一筆,都是那台伺服器寫的,不是你本人。」現在去把它看清楚——今天要盯的那一格叫「誰」。
- 打開 Notion 那張跟團紀錄表
- 找到「誰」和「Created by」這兩欄(看不到的話,講師會示範怎麼把它們顯示出來)
- 找到你第 5 堂寫進去的那一筆(沒有的話看同學的,長得一模一樣):「誰」那一格是空的——這張表上沒有任何地方指向你這個人
- 「Created by」那一格是一個機器人(課程的整合),「來源」寫著「頁面」,而「跟團者」只是你的頁面填進去的一串字
- 記住這四格,等一下要回來比對
上一堂你的按鈕把資料交給課程的伺服器,是伺服器動手寫進 Notion 的。它用的是課程的鑰匙、不是你的鑰匙,所以 Notion 記下「這一列是它建的」。系統從來不會亂猜是誰做的,它只記錄「拿誰的鑰匙開的門」。
(至於旁邊那個 Created by,今天不會變成你——為什麼,第 06 節揭曉。)
這門課後半段出現三種「誰有權限動資料」的安排,前兩種你已經摸過了:
| ① 唯讀金鑰 | 第 5 堂你電腦上那把。只能看,不能改 |
| ② 可寫金鑰 | 藏在課程伺服器裡。能寫,但寫出來的掛在它名下 |
| ③ 你自己的授權 | 今天。不是給你鑰匙,是你親自去開門,說「這幾個房間他可以進」 |
你每天都在做這件事:用 Google 帳號登入新網站、把 Notion 接上某個 AI 工具。那個跳出來的「允許存取」畫面就是它,行話叫 OAuth。
重點只有一句:你沒有把密碼交出去,你交出去的是一張「限定範圍的通行證」。
這一步只要瀏覽器 + Notion 帳號,用不到 Claude Code。走完你會看到一個寫著「授權完成 🎉 你好,你的名字」的頁面,上面有一串識別碼。
畫面上的字看不懂就先別按,舉手問——這一步按下去才算數。
- ① 點這個連結(建議按住 Command 用新分頁打開):vibe-course.mixxin.tw/oauth/start
- ② 用公司的 Notion 帳號登入
- ③ 出現選擇頁面的畫面 → 先不要急著按允許,把畫面上的字讀一遍
- ④ 只勾「跟團紀錄」那一頁,然後按「允許 / Allow」
- ⑤ 看到「授權完成 🎉 你好,○○○」——把畫面上那串識別碼複製起來,貼到記事本或 Claude Code 的對話框裡先放著
① 看到「授權沒有完成」或「換 token 失敗」→ 回去重點一次連結從頭走。授權碼只活 10 分鐘,中途跑去回訊息就會過期。
② 勾選畫面上找不到「跟團紀錄」→ 那張表還沒分享給你的帳號,舉手找講師,這個你自己解不了。
③ 登入的是別的 Notion 帳號、或成功頁關掉沒抄到識別碼 → 用無痕視窗再走一遍就好,識別碼是同一串,不會壞掉。
④ 上面都不是?舉手。這一步不靠 AI 自救,卡住不用硬撐——把你看到的畫面留著別關,講師看一眼就知道。
剛剛那個畫面你這輩子按過幾十次了,多數人按到後來只剩一個動作:找「允許」在哪裡。今天把它看清楚一次。
Notion 這個畫面設計得很誠實:它不是一個「要不要開放我的 Notion」的開關,而是要你一頁一頁指定。
你沒勾的頁面,拿到通行證的那一方看不到、也搜尋不到——這不是「講好了不看」,是技術上真的拿不到。
所以按下允許之前,養成問自己三個問題的習慣。這三題跟第 5 堂的危險雷達一樣,是可以帶著走一輩子的:
| 它要的是什麼範圍? | 整個帳號,還是你可以自己指定?只要能指定,就指定到最小 |
| 它要讀,還是也要寫? | 只讀=最壞情況是被看光;可寫=它能改、能刪。這兩件事差非常多 |
| 我怎麼收回? | 按下去之前先知道撤銷的入口在哪。找不到撤銷入口的服務,這件事本身就是警訊 |
| 實際要做什麼 | 讓「我要跟」改成送到另一個網址,而且多帶上你的識別碼 |
| 你會看到什麼變化 | 你的畫面幾乎沒有變化——變化在 Notion 那張表上。這正是重點 |
| 需要什麼工具 | Claude Code + 你剛剛那串識別碼 |
[貼上你的識別碼] 和 REPLACE_ME 是要你換掉的空格,連中括號一起刪掉。不確定該用 A 還是 A0?問 Claude Code:「我按『我要跟』的時候,有沒有 POST 到任何網址?」
路線 A · 開場那一筆有出現在跟團紀錄表上
我的「我要跟」按鈕目前會把這一票送到
https://vibe-course.mixxin.tw/api/join
請改成送到這個網址:
https://vibe-course.mixxin.tw/api/join-as-me
送出的內容要多帶一個 user_id 欄位,格式是這樣:
{"name": "店名", "who": "我的名字", "user_id": "[貼上你的識別碼]"}
who 請繼續用我程式碼裡那個寫死我名字的常數,不要改掉也不要改名。
其他都不要改:原本成功/失敗的提示、票數怎麼顯示,全部保留。
送出失敗時請把伺服器回的錯誤訊息顯示出來,我需要看到它在說什麼。
路線 A0 · 那一筆沒有出現(一段到底,不用回頭補上一堂)
我的午餐揪團頁上有一顆「我要跟」按鈕,
目前點下去只有我自己的畫面會變(狀態記在瀏覽器的 localStorage 裡)。
請改成:點擊時,除了原本的動作之外,再用 POST 把這一票送到
https://vibe-course.mixxin.tw/api/join-as-me
送出的內容長這樣:
{"name": "店名", "who": "我的名字", "user_id": "[貼上你的識別碼]"}
請把「我的名字」做成寫在最上面、叫 VOTER_NAME 的常數,值先填「REPLACE_ME」。
送出成功之後在那張卡片上顯示「已投票 ✓」。
失敗的話在同一張卡片顯示紅色提示,內容是伺服器回的錯誤訊息
(回應 JSON 裡的 error 欄位),前面加上「這一票沒送出去:」。
失敗時人數不要加,不要讓整頁壞掉。原本的 localStorage 邏輯請保留。
- 貼上 Prompt A 或 A0,讓 Claude Code 改你的頁面(走 A0 的人:先把
REPLACE_ME換成你的名字再按按鈕,那一格全班看得到) - 改完問 AI 一句:「我程式碼裡那個寫死我名字的常數叫什麼、在第幾行?」——記著答案,下一節要用
- 重整頁面,按一下「我要跟」,確認畫面顯示送出成功
- 打開 Notion 那張跟團紀錄表捲到最下面:你那一筆的「誰」欄是你的名字和頭像、「來源」寫著「本人授權」
① 「找不到你的授權,請重新授權一次」→ 識別碼貼錯或漏字,回第 03 節重新複製整串(隔幾天突然失效也是這個訊息,重走一次授權就好)。
② 「請提供 user_id(授權完成頁上那一串)」→ 那一格是空的,多半是中括號沒刪乾淨。
③ 「送出失敗,等一下再試」→ 最常見的原因是授權時沒勾到「跟團紀錄」那一頁,回第 03 節重走一次授權。
④ 畫面完全沒反應 → 右鍵 → 檢查 → Console,紅色的字就是它在抱怨什麼。
都不是上面這幾種?把整段錯誤訊息複製起來貼給 Claude Code,加一句:「我的頁面應該要送到
/api/join-as-me,帶 name、who、user_id 三個欄位。請看是哪裡不對、用白話解釋,然後修好它。」你的頁面上還有一個東西沒被檢查過:「跟團者」那一欄的名字,是你自己在程式碼裡打的字(上一節你剛問過 AI 它在第幾行)。既然是你打的,那就試試看——打成別人的名字會發生什麼事?
30 秒實驗 · 現在做
- 跟 Claude Code 說:「把那個投票用的名字常數暫時改成『旁邊同事的名字』」(先跟他說一聲——你等一下就懂為什麼要先說;落單的人用「王小明」)
- 重整頁面,按一次「我要跟」
- 打開 跟團紀錄表看最新那一筆:「跟團者」真的變成同事的名字了,但「誰」欄還是你——那一格你改不動
- 把常數改回你自己的名字(實驗那筆留著,就是證據)
| 第 5 堂那一筆 | 跟團者=你的名字 · 誰=(空的) · Created by=🤖 課程的整合 |
| 今天這一筆 | 跟團者=你的名字 · 誰=你的姓名和頭像 · Created by=🤖 你授權的那支 app |
| 剛剛實驗那一筆 | 跟團者=同事的名字(你打的)· 誰=還是你 · Created by=🤖 同上 |
「跟團者」是自稱——你的程式碼填的一段字,你想填誰就填誰,系統照收。所以你剛剛用同事的名義投了一票,這就是為什麼要先跟他說一聲。
「誰」是身分——那一格不是你的頁面填的名字,是後端拿你那張通行證去問「這是誰」問出來的。你改頁面上那個名字常數,它動都不動。
你以後看到的「操作紀錄」「稽核軌跡」——誰改了價格、誰核准了這筆——可信的從來不是那個人填的名字,是系統從鑰匙推出來的那一格。這就是第 5 堂危險雷達第二條:前端說「我是誰」,永遠只是自稱。
你可能以為那一格會變成你。不會:第 5 堂那些列寫的是課程的整合,今天這些列寫的是你剛剛授權的那支 app——兩個都是機器,只是換了一台。
因為那一格記的從來不是「誰想吃這家店」,而是「哪一支程式動的手」。這在真實世界很常見:你在公司系統看到的異動紀錄,作者常常是某個自動化流程或串接工具。要知道「背後是哪個人」,得有人特地把它記下來——今天那個「誰」欄就是特地記的。
有件事必須講清楚。不是為了嚇你,是因為它就是這堂課最有用的東西。
這不是這門課特別可疑——你按過的每一個「允許存取」都是這個結構。差別只在:你勾了多少。
所以第 04 節那三個問題不是道德勸說,是操作說明:範圍勾到最小、分清楚讀跟寫、按之前先知道撤銷在哪。現在就把最後一項練一次——
撤銷演練 · 現在做一次
- 打開 Notion → 右上角設定 → 找到「我的連線 / My connections」
- 你會看到自己授權過的東西,包括今天這一個
- 點進去看它現在能存取哪幾頁——應該就是你剛剛勾的那一頁,沒有別的。這裡可以加、可以減、也可以整個移除
- 課後請自己回來把它移除(移除之後你的頁面就送不出去了,那是正常的,不是壞掉)
以後遇到看不懂的授權畫面,把那幾行字貼給 AI,問它:「我答應之後它實際上能對我的資料做什麼?最壞情況是什麼?哪幾項其實可以不給?」那個畫面你現在看得懂了,這就夠了。
- 建 Notion public connection(Integrations → 類型選 Public)。installation scope 選「Any workspace」,建立後不可改。OAuth 不需要送審(要審的是上架 Marketplace,用不到)
- redirect URI 填
https://vibe-course.mixxin.tw/oauth/callback,與 Cloudflare 的OAUTH_REDIRECT_URI一字不差;NOTION_CLIENT_ID/NOTION_CLIENT_SECRET設進 Pages secret(Production + Preview),設完重新部署,並確認 KVTOKENS已綁定 - 跟團紀錄表分享給全班每一個人且可編輯(授權畫面上勾不到它,整堂做不下去),並在檢視上把「誰」(People)和「Created by」兩欄都打開——「誰」欄就是本堂的 WOW,Created by 是拿來對照的
- 三十秒自我驗收:打開
/oauth/start應該直接跳 Notion 授權畫面;看到授權功能尚未啟用就是 secret 沒設或沒重新部署,這時候全班點下去都是這個 - 課前自己完整走一次(授權 → 打
/api/join-as-me→ 確認那筆的「誰」欄顯示本人姓名頭像),這件事不成立整堂垮掉;順便留一個「示範用的自己」上課展示。注意 Created by 不會變成本人(2026-08-20 實測顯示的是整合名稱),不要對學員這樣講 - 課前掃全班 PR 分兩群:已經在 POST
/api/join的走 A,還沒的走 A0(2026-08 這輪 6 : 8)。只能看內容有沒有 POST——PR 標題與資料夾的堂數都停在他第一次交作業時,不可信 - 不要宣稱通行證永久有效:實測 Notion 有給 refresh token,但課程後端沒有實作續期、也沒存效期——失效的兜底就是「重走一次授權」(識別碼不變)。第 06 節那個實驗會讓表上多出幾筆「用同事名字」的紀錄,是教具不要事先清
作業:一張 issue + 一個 PR——把「我要跟」改成以你本人的身分送出。PR 描述回答這三題:
- 「跟團者」和「誰」這兩格,哪一格你的程式碼改得動、哪一格改不動?這件事為什麼重要?
- 你在授權畫面上勾了什麼、沒勾什麼?為什麼這樣勾?
- 課程的後端現在能以你的身分做什麼?你打算怎麼收回?
講師 / 助教檢核重點
- 每人在跟團紀錄表上有一筆「誰」欄是本人、來源是「本人授權」的紀錄
- 每人說得出「跟團者是自稱、「誰」是身分」(表上找得到他那筆用別人名字的實驗紀錄)
- 每人說得出自己勾了哪一頁(而不是「我按了允許」),並打得開 Notion 的「我的連線」
- 每人的頁面送出失敗時看得到錯誤訊息,不是整頁壞掉
- 每人的 PR 描述三題答完