MIXXIN Vibe Coder 入門課
LESSON 06 · 午餐揪團頁主線

以你的身分:OAuth

上一堂那顆「我要跟」已經能把票寫進 Notion——但你去看那張表,沒有任何一格指向你這個人。今天你要自己出面授權一次,讓同一顆按鈕以你本人的名義寫進去(上一堂還沒接上的人不用補,今天一段就到位)。而在按下「允許」之前,你會第一次真正看懂那個勾選畫面在問你什麼。

你自己出面授權 「誰」欄變成你 看懂那個允許畫面 產出:以本人名義的紀錄
完成定義 · Definition of Done
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
01上一堂結尾那個問號:表上沒有一格是你

上一堂最後我們留了一句話:「那張表上每一筆,都是那台伺服器寫的,不是你本人。」現在去把它看清楚——今天要盯的那一格叫「誰」

  • 打開 Notion 那張跟團紀錄表
  • 找到「誰」「Created by」這兩欄(看不到的話,講師會示範怎麼把它們顯示出來)
  • 找到你第 5 堂寫進去的那一筆(沒有的話看同學的,長得一模一樣):「誰」那一格是空的——這張表上沒有任何地方指向你這個人
  • 「Created by」那一格是一個機器人(課程的整合),「來源」寫著「頁面」,而「跟團者」只是你的頁面填進去的一串字
  • 記住這四格,等一下要回來比對
🤖那個機器人是真的存在的一個「人」

上一堂你的按鈕把資料交給課程的伺服器,是伺服器動手寫進 Notion 的。它用的是課程的鑰匙、不是你的鑰匙,所以 Notion 記下「這一列是它建的」。系統從來不會亂猜是誰做的,它只記錄「拿誰的鑰匙開的門」。

所以今天的問題只有一句:要怎麼讓「誰」那一格變成你的名字和頭像?答案不是「請講師改一下」——是你得自己出面,把門打開一次
(至於旁邊那個 Created by,今天不會變成你——為什麼,第 06 節揭曉。)
02第三把鑰匙:不是給你鑰匙,是你自己去開門

這門課後半段出現三種「誰有權限動資料」的安排,前兩種你已經摸過了:

① 唯讀金鑰第 5 堂你電腦上那把。只能看,不能改
② 可寫金鑰藏在課程伺服器裡。能寫,但寫出來的掛在它名下
③ 你自己的授權今天。不是給你鑰匙,是你親自去開門,說「這幾個房間他可以進」
🪪「授權」不等於「把密碼給它」

你每天都在做這件事:用 Google 帳號登入新網站、把 Notion 接上某個 AI 工具。那個跳出來的「允許存取」畫面就是它,行話叫 OAuth
重點只有一句:你沒有把密碼交出去,你交出去的是一張「限定範圍的通行證」

03動手一:走一次授權

這一步只要瀏覽器 + Notion 帳號,用不到 Claude Code。走完你會看到一個寫著「授權完成 🎉 你好,你的名字」的頁面,上面有一串識別碼。

動手前先讀完。等一下那個畫面會問你「要讓它存取哪些頁面」——只勾「跟團紀錄」一頁,不要按全選、不要順手多勾。為什麼要挑到最小,下一節整段講;而勾錯的人等一下送出會失敗,那就是「範圍真的在管事」最直接的證據。
畫面上的字看不懂就先別按,舉手問——這一步按下去才算數。
  • ① 點這個連結(建議按住 Command 用新分頁打開):vibe-course.mixxin.tw/oauth/start
  • ② 用公司的 Notion 帳號登入
  • ③ 出現選擇頁面的畫面 → 先不要急著按允許,把畫面上的字讀一遍
  • 只勾「跟團紀錄」那一頁,然後按「允許 / Allow」
  • ⑤ 看到「授權完成 🎉 你好,○○○」——把畫面上那串識別碼複製起來,貼到記事本或 Claude Code 的對話框裡先放著
那串識別碼是什麼?它不是密碼,也不是鑰匙——比較像寄物櫃的號碼牌。你剛剛換到的那張通行證被課程後端收在保險箱裡,識別碼只是拿來說「拿我那一份」。
卡住了怎麼辦:
① 看到「授權沒有完成」或「換 token 失敗」→ 回去重點一次連結從頭走。授權碼只活 10 分鐘,中途跑去回訊息就會過期。
② 勾選畫面上找不到「跟團紀錄」→ 那張表還沒分享給你的帳號,舉手找講師,這個你自己解不了。
登入的是別的 Notion 帳號、或成功頁關掉沒抄到識別碼 → 用無痕視窗再走一遍就好,識別碼是同一串,不會壞掉。
上面都不是?舉手。這一步不靠 AI 自救,卡住不用硬撐——把你看到的畫面留著別關,講師看一眼就知道。
IMAGE HANDOFF assets/img/l6-consent-screen.jpg 有人盯著 Notion 授權勾選畫面、手指停在「允許」上還沒按下去的氛圍照
圖 3.1按下去之前的三秒鐘——這堂課想留給你的就是這三秒待補圖 · L6-P1
04那個畫面到底在問你什麼本堂最重要的一段

剛剛那個畫面你這輩子按過幾十次了,多數人按到後來只剩一個動作:找「允許」在哪裡。今天把它看清楚一次。

🔓你給的不是「全部」,是「你勾的那幾個」

Notion 這個畫面設計得很誠實:它不是一個「要不要開放我的 Notion」的開關,而是要你一頁一頁指定
你沒勾的頁面,拿到通行證的那一方看不到、也搜尋不到——這不是「講好了不看」,是技術上真的拿不到。

所以按下允許之前,養成問自己三個問題的習慣。這三題跟第 5 堂的危險雷達一樣,是可以帶著走一輩子的:

它要的是什麼範圍?整個帳號,還是你可以自己指定?只要能指定,就指定到最小
它要讀,還是也要寫?只讀=最壞情況是被看光;可寫=它能改、能刪。這兩件事差非常多
我怎麼收回?按下去之前先知道撤銷的入口在哪。找不到撤銷入口的服務,這件事本身就是警訊
拿你自己按過的來試:「某個 AI 工具要你把整個 Notion workspace 接上去」→ 中第一題:能不能改成只勾你要它處理的那幾頁?多數工具其實可以
05動手二:讓頁面以你的名義送出
實際要做什麼讓「我要跟」改成送到另一個網址,而且多帶上你的識別碼
你會看到什麼變化你的畫面幾乎沒有變化——變化在 Notion 那張表上。這正是重點
需要什麼工具Claude Code + 你剛剛那串識別碼
老規矩:[貼上你的識別碼]REPLACE_ME要你換掉的空格,連中括號一起刪掉。
不確定該用 A 還是 A0?問 Claude Code:「我按『我要跟』的時候,有沒有 POST 到任何網址?」

路線 A · 開場那一筆出現在跟團紀錄表上

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 · 那一筆沒有出現(一段到底,不用回頭補上一堂)

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 三個欄位。請看是哪裡不對、用白話解釋,然後修好它。」
06揭曉:同一張表上,「自稱」跟「身分」不是同一件事

你的頁面上還有一個東西沒被檢查過:「跟團者」那一欄的名字,是你自己在程式碼裡打的字(上一節你剛問過 AI 它在第幾行)。既然是你打的,那就試試看——打成別人的名字會發生什麼事?

30 秒實驗 · 現在做

  • 跟 Claude Code 說:「把那個投票用的名字常數暫時改成『旁邊同事的名字』」(先跟他說一聲——你等一下就懂為什麼要先說;落單的人用「王小明」)
  • 重整頁面,按一次「我要跟」
  • 打開 跟團紀錄表看最新那一筆:「跟團者」真的變成同事的名字了,但「誰」欄還是你——那一格你改不動
  • 把常數改回你自己的名字(實驗那筆留著,就是證據)
第 5 堂那一筆跟團者=你的名字 · 誰=(空的) · Created by=🤖 課程的整合
今天這一筆跟團者=你的名字 · 誰=你的姓名和頭像 · Created by=🤖 你授權的那支 app
剛剛實驗那一筆跟團者=同事的名字(你打的)· 誰=還是你 · Created by=🤖 同上
🎭「自稱」可以亂寫,「身分」不行

「跟團者」是自稱——你的程式碼填的一段字,你想填誰就填誰,系統照收。所以你剛剛用同事的名義投了一票,這就是為什麼要先跟他說一聲
「誰」是身分——那一格不是你的頁面填的名字,是後端拿你那張通行證去問「這是誰」問出來的。你改頁面上那個名字常數,它動都不動

你以後看到的「操作紀錄」「稽核軌跡」——誰改了價格、誰核准了這筆——可信的從來不是那個人填的名字,是系統從鑰匙推出來的那一格。這就是第 5 堂危險雷達第二條:前端說「我是誰」,永遠只是自稱。

🤖順便看一眼「Created by」——它其實不是人

你可能以為那一格會變成你。不會:第 5 堂那些列寫的是課程的整合,今天這些列寫的是你剛剛授權的那支 app——兩個都是機器,只是換了一台。
因為那一格記的從來不是「誰想吃這家店」,而是「哪一支程式動的手」。這在真實世界很常見:你在公司系統看到的異動紀錄,作者常常是某個自動化流程或串接工具。要知道「背後是哪個人」,得有人特地把它記下來——今天那個「誰」欄就是特地記的。

Wow 時刻 → 你的頭像出現在公司的 Notion 上,而那一列不是你手打的——是你自己做的頁面代你送出去的,而且它知道你是誰。從第 1 堂那個純靜態頁面走到這裡,這是最後一塊:你的作品開始能代表你
IMAGE HANDOFF assets/img/l6-author-column.jpg 兩人指著螢幕上 Notion 表的「誰」欄位、一格空白一格是真人頭像的氛圍照
圖 6.1同一張表、上下兩列:一列沒有人,一列是你待補圖 · L6-P2
07誠實的一段:你剛剛交出去了什麼

有件事必須講清楚。不是為了嚇你,是因為它就是這堂課最有用的東西

你剛剛授權之後,那張通行證存在課程的後端。也就是說,課程在技術上做得到「以你的身分」讀寫你勾的那一頁,而且不需要再問你一次。
這不是這門課特別可疑——你按過的每一個「允許存取」都是這個結構。差別只在:你勾了多少

所以第 04 節那三個問題不是道德勸說,是操作說明:範圍勾到最小、分清楚讀跟寫、按之前先知道撤銷在哪。現在就把最後一項練一次——

撤銷演練 · 現在做一次

  • 打開 Notion → 右上角設定 → 找到「我的連線 / My connections」
  • 你會看到自己授權過的東西,包括今天這一個
  • 點進去看它現在能存取哪幾頁——應該就是你剛剛勾的那一頁,沒有別的。這裡可以加、可以減、也可以整個移除
  • 課後請自己回來把它移除(移除之後你的頁面就送不出去了,那是正常的,不是壞掉)
今天真正要留給你的東西:花五分鐘去你的 Google 帳號看一次「第三方應用程式存取權」,多數人會找到三、五個早就忘記自己授權過的服務。
以後遇到看不懂的授權畫面,把那幾行字貼給 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_IDNOTION_CLIENT_SECRET 設進 Pages secret(Production + Preview),設完重新部署,並確認 KV TOKENS 已綁定
  • 跟團紀錄表分享給全班每一個人且可編輯(授權畫面上勾不到它,整堂做不下去),並在檢視上把「誰」(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 描述回答這三題:

  • 跟團者」和「」這兩格,哪一格你的程式碼改得動、哪一格改不動?這件事為什麼重要?
  • 你在授權畫面上勾了什麼、沒勾什麼?為什麼這樣勾?
  • 課程的後端現在能以你的身分做什麼?你打算怎麼收回?
關於那串識別碼:它會跟著頁面一起進 PR,全班看得到——這門課沒關係,最壞情況是同學用你的名義投一票午餐。但記住這個結構:正式產品不會把識別碼寫在頁面裡,而是讓使用者自己登入、由後端認出他是誰。不放心就交完作業去把授權移除

講師 / 助教檢核重點

  • 每人在跟團紀錄表上有一筆「誰」欄是本人、來源是「本人授權」的紀錄
  • 每人說得出「跟團者是自稱、「誰」是身分」(表上找得到他那筆用別人名字的實驗紀錄)
  • 每人說得出自己勾了哪一頁(而不是「我按了允許」),並打得開 Notion 的「我的連線」
  • 每人的頁面送出失敗時看得到錯誤訊息,不是整頁壞掉
  • 每人的 PR 描述三題答完