2fa.bityo.tw · GitHub · App · CC BY-NC 4.0
可以多人共用的 TOTP 兩步驟驗證器。驗證碼放在群組裡,用身分組決定誰能看、能改什麼;也可以設定加密密碼,讓金鑰只在自己的裝置上解開。
原本後端使用 Firebase(Auth + Firestore),2026/06/18 改為 Supabase(PostgreSQL + Auth + RLS)。網站和 Securibit App(iOS、Android、macOS、Windows、Linux)共用同一個 Supabase,在網站改的資料 App 馬上看得到。
- 驗證碼
- 手動輸入、貼上
otpauth://連結、掃描或上傳 QR Code - 整批匯入 Google Authenticator 的轉移 QR Code 與文字備份
- 位數、週期、演算法可以自訂
- 搜尋、類別篩選、調整順序
- 匯出成 QR Code 或文字備份
- 手動輸入、貼上
- 群組
- 每個人都有一個預設群組,也可以建立群組和別人共用
- 用 Email、使用者 ID 或邀請連結邀請成員
- 類似 Discord 的權限:身分組可以疊加、有上下階層,單筆驗證碼可以再對身分組或成員個別允許、拒絕
- 群組操作紀錄
- 加密:設定加密密碼後,加密群組的金鑰在瀏覽器裡加解密,資料庫只存密文
- 帳號
- Google 登入
- 使用者 ID、個人頁、登入紀錄與帳號操作紀錄
- 已登入的裝置:可以登出單一裝置或其他所有裝置
- 後台:管理使用者、全站身分組與權限、所有群組,以及全站操作紀錄
- 通知:鈴鐺收件匣(系統、帳戶、功能三類)、每種通知可以自己開關;後台可以依身分組、平台、裝置、版本發公告,並設定 App 的最低版本;Android App 收得到推播
- 即時同步:群組、邀請與驗證碼有變動時,網站和 App 自動更新
- App 下載頁:讀取 App 在 GitHub 的最新 Release,依訪客的平台排序
- 到 Supabase 建立專案。
- 到 SQL Editor 貼上並執行
database/init.sql,一次建好所有資料表、函式、RLS 與即時同步。這個檔案只給全新的專案執行一次。 - 到 Authentication → Sign In / Providers → Google 開啟 Google 登入,填入自己在 Google Cloud Console 建的「網頁應用程式」OAuth 用戶端 ID 與密鑰。
- 到 Authentication → URL Configuration:
- Site URL 填網站網址。
- Redirect URLs 加入
https://<你的網域>/auth/callback;本機開發另外加http://localhost:3000/auth/callback。
- 第一個管理員的設定方式寫在
database/init.sql最後面。
NEXT_PUBLIC_SUPABASE_URL=https://<proj_name>.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=<anon_public_key>
# 僅後端使用(刪除帳號、記錄登入、群組驗證碼、後台 API),切勿外洩
SUPABASE_SERVICE_ROLE_KEY=<service_role_key>資料庫有新的通知時,用 pg_net 呼叫 Edge Function edge-functions/push/index.ts,由它透過 Firebase Cloud Messaging 推播到 Android App。沒設定的話鈴鐺照常可用,只是不會推播。
- Edge Function:Dashboard → Edge Functions → 新增函式,名稱
push,貼上edge-functions/push/index.ts的內容後部署;在函式設定把 Verify JWT 關掉(改由資料庫帶的x-push-secret驗證)。 - Secrets:Edge Functions → Secrets 新增
FCM_SERVICE_ACCOUNT,值是 Firebase 服務帳戶的整個 JSON(Firebase Console → 專案設定 → 服務帳戶 → 產生新的私密金鑰)。SUPABASE_URL、SUPABASE_SERVICE_ROLE_KEY由 Supabase 自動提供。 - Vault:
init.sql(或 migration 0024)已經在 Vault 產生push_webhook_secret。專案網址請自己在 SQL Editor 執行一次(網址不進 repo):select vault.create_secret('https://<project-ref>.supabase.co', 'project_url');
- 補送(建議):Database → Extensions 開啟
pg_cron後執行下面這行,每分鐘補送沒送出去的推播(先開好pg_cron再跑init.sql的話會自動排好):select cron.schedule('securibit-push-retry', '* * * * *', 'select public.push_retry()');
服務帳戶 JSON、Vault 的值都不要放進 repo。
pnpm i
pnpm dev
pnpm build && pnpm start群組與權限的規則見 docs/groups-and-permissions.md;Firebase 舊資料的搬移紀錄見 MIGRATION.md。
由幣友 BITYO 與靈魂之神工作室共同開發。
有問題就開 issue。要改東西的話 fork 出去開分支發 PR,commit 訊息寫清楚、確認 pnpm build 過得了再丟。
動樣式請用 Tailwind,沿用 tailwind.config.ts 既有的設計 token,別改到原本的版面。
採用 CC BY-NC 4.0,完整條款見 LICENSE。
可自由使用、改作、學習,但不能商用,且要標明來源(TershiXia/幣友 BITYO/靈魂之神工作室)。
© 2026 TershiXia · 幣友 BITYO 🤝 靈魂之神工作室

