第三章:台灣接案必備武器:Line Login 開發者後台申請與 Callback 串接

在上一章中,我們成功攻克了 Google 登入。但在台灣、日本與東南亞的商業環境中,幾乎沒有任何一個 B2C (企業對消費者) 的專案是可以跳過 Line 登入 的。

客戶一定會這樣要求你:「我要讓客人點一下就登入,不要叫他們記密碼!台灣人每支手機都有 Line 啦!」 這句話背後的商業價值是驚人的:如果你成功引導使用者用 Line 登入你的網站,你不但能獲得他的基本資料,還能直接與你的 Line 官方帳號 (Line Official Account) 綁定。一旦綁定成功,你未來就能透過 Line Messaging API 直接發送「客製化的促銷訊息」到他的手機裡,跳出推播通知!這就是現代化 SaaS 平台最強大的行銷武器。

本章我們將手把手帶你闖關 Line Developers 開發者後台,並將 Line 登入優雅地融合進我們原有的 Auth.js 架構中。


🟢 步驟一:Line Developers 後台闖關指南

與 Google Cloud Console 的企業級介面不同,Line 的後台相對簡單,但裡面藏了很多隱藏的地雷。

1. 建立 Provider (開發商/公司名稱)

  1. 前往 LINE Developers Console 並登入你的個人 Line 帳號。
  2. 點擊 Providers 旁邊的 Create 按鈕。 (註:Provider 的概念就等於「開發這支程式的公司或團隊名稱」,例如 `VibeTutor Inc.`。這個名稱會出現在使用者的授權畫面上,所以請填寫真實且專業的名稱)

2. 建立 LINE Login Channel

一個 Provider 底下可以擁有多個 Channel (例如一個是 Login,一個是 Messaging API 機器人)。

  1. 點擊剛建好的 Provider,選擇 「Create a new channel」
  2. 選擇 「LINE Login」
  3. 開始填寫資料:
    • Channel type: LINE Login
    • Provider: VibeTutor Inc.
    • Region to provide the service: 選擇 Taiwan 或 Global。
    • Channel icon: 強烈建議上傳,這是給使用者的第一印象。
    • Channel name: 填入 `VibeTutor 官網登入`。
    • Channel description: 填寫簡單的服務介紹。
    • App types: 勾選 `Web app` (我們是網頁登入,千萬不要勾選 Native app)。
  4. 勾選同意條款後,點擊 Create 建立。

3. 取得通關密鑰 (Channel ID & Secret)

建立成功後,你會來到 Channel 的總覽頁面。 在 Basic settings 標籤頁往下滾動,你會看到兩個極度重要的資訊:

  • Channel ID:請複製它,它等於 OAuth 裡的 Client ID。
  • Channel secret:請複製它,它等於 OAuth 裡的 Client Secret。

4. 設定回呼網址 (Callback URL)

在上一章我們學過,當使用者在 Line 登入成功後,Line 需要知道要把「授權碼 (Auth Code)」丟到哪個網址給我們。

  1. 切換到 LINE Login 標籤頁。
  2. 找到 Web app 區塊,點擊 Callback URL 旁邊的 Edit。
  3. 填入 Auth.js 預設的死板路徑: 👉 `http://localhost:3000/api/auth/callback/line` (🚨 注意:未來部署到 Vercel 時,務必回來這裡加上正式網域的 URL)
  4. 點擊 Update 儲存。

5. 終極魔王關:發布 (Publish) 你的 Channel

這是 99% 的新手都會卡關 的地方! 在網頁的最上方,你會看到一個標籤寫著 `Developing` (開發中)。 只要維持在這個狀態,除了你自己的 Line 帳號以外,全世界的人點擊登入都會跳出錯誤畫面!

  • 請點擊 `Developing` 標籤,然後勇敢地按下 `Publish`
  • 狀態變成 `Published` 後,你的登入功能才算是真正上線了。

📧 步驟二:Line Email 取得權限申請 (特殊坑點)

與 Google 非常不同的一點是:Line 預設絕對不會把使用者的 Email 交給你! 它只會給你使用者的名字 (displayName) 和大頭貼 (pictureURL)。

如果你的網站非常需要 Email 作為系統的唯一識別碼(例如你需要發送收據或重設密碼),你必須主動向 Line 申請。

  1. Basic settings 標籤頁,滾動到最底部。
  2. 找到 Email address permission
  3. 點擊 `Apply` 或 `Request`。
  4. 系統會要求你上傳一張截圖,證明你的網站有在某個地方提醒使用者你會收集 Email(你可以截圖你網站的隱私權政策 Policy)。
  5. 提交審核。通常如果是正常的應用程式,審核通過率極高。

⚠️ Vibe Coding 注意事項: 如果你沒有申請到這個權限,等等我們在 Auth.js 裡面強制索取 Email 時,Line 會直接報錯拒絕連線!如果你不需要 Email,只是需要使用者的 Line ID (Profile Subject) 來辨識身分,那你可以跳過這一步。


💻 步驟三:整合 Line Provider 到 Auth.js

好了,後台設定完畢,回到我們熟悉的程式碼世界。

1. 更新環境變數 (.env.local)

把你剛才複製下來的 Line 雙寶貼上去:

```env

既有的 Google 憑證...

AUTH_GOOGLE_ID="12345..." AUTH_GOOGLE_SECRET="GOCSPX-..."

新增 Line OAuth 憑證

AUTH_LINE_ID="你剛才複製的_Channel_ID" AUTH_LINE_SECRET="你剛才複製的_Channel_Secret" ```

2. 更新核心設定檔 (src/auth.ts)

打開 `src/auth.ts`,把 LineProvider 加進去陣列中。你會發現 Auth.js 的架構美得令人窒息,要新增一個登入方式,真的只要幾行字:

```typescript import NextAuth from "next-auth" import GoogleProvider from "next-auth/providers/google" import LineProvider from "next-auth/providers/line" // 引入 Line

export const { handlers, signIn, signOut, auth } = NextAuth({ providers: [ GoogleProvider({ clientId: process.env.AUTH_GOOGLE_ID, clientSecret: process.env.AUTH_GOOGLE_SECRET, }), LineProvider({ clientId: process.env.AUTH_LINE_ID, clientSecret: process.env.AUTH_LINE_SECRET,

  // 🚨 如果你剛剛沒有申請 Email 權限,這裡絕對不要加入額外的 scope 要求
  // 預設它只會要 'profile' 和 'openid'
  
  // 🚨 特殊地雷:OIDC 的防護機制
  // Auth.js 升級到 v5 之後嚴格遵守 OIDC 規範,Line API 回傳的 state 有時會有相容性問題
  // 如果你在點擊登入時遇到 state 錯誤,請解除註解以下這行:
  // checks: ["state"], 
}),

], }) ```

3. 測試雙位一體的登入畫面!

確保你的 `npm run dev` 伺服器正在運行。 打開瀏覽器,手動輸入網址:`http://localhost:3000/api/auth/signin`

見證奇蹟的時刻到了!你的極簡登入畫面上,現在出現了兩顆按鈕:

  1. Sign in with Google
  2. Sign in with LINE

點擊 Line 登入,畫面會自動跳轉到 Line 的綠色授權畫面。 如果你是在手機上點擊,它甚至會直接打開你手機裡的 Line App 進行免密碼授權!授權成功後,完美跳回你的 `localhost`。


🤝 商業進階題:Account Linking (帳號綁定) 的挑戰

當你同時提供兩種以上的登入方式時,身為架構師的你,立刻要面臨一個極度棘手的商業邏輯挑戰:

情境模擬: 小明昨天用 `ming@gmail.com` 點了「使用 Google 登入」,在你的網站上買了一堂課。 今天小明換了一台手機,他忘了昨天是用什麼登入的,於是點了「使用 Line 登入」。 剛好,他的 Line 綁定的 Email 也是 `ming@gmail.com`。

問題來了: 你的系統應該要把這兩次登入視為「同一個小明」,還是「兩個不同的小明」?

  • 如果視為不同的人,小明登入後會氣瘋,因為他買的課不見了。
  • 如果系統擅自把他們合併,可能會有資安風險(如果有人偽造了信箱)。

這個問題在業界被稱為 Account Linking (帳號綁定)

幸運的是,在我們準備使用的 Supabase Adapter 架構下,它預設的行為邏輯是: 「不同的 Provider,只要是同一個 Email,系統會拒絕自動合併,除非使用者明確同意,以防止帳號劫持攻擊。」 要處理這種複雜的 Account Linking,你需要一個強大的關聯式資料庫。這就是我們下一章的重頭戲:拋棄 Cookie Session,全面擁抱 Supabase PostgreSQL 資料庫的 Adapter 對接實戰!

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!