Valo Documentation
首頁
開發設置
專案結構
登入前單元
登入後單元
聊天對話單元
聊天系統
群組系統
認證
部署
故障排除
首頁
開發設置
專案結構
登入前單元
登入後單元
聊天對話單元
聊天系統
群組系統
認證
部署
故障排除
  • 專案文檔

    • 開發環境設置指南
    • 專案資料夾結構說明
    • - 聊天功能核心
    • - 群組目錄
    • 身份驗證
    • 登入前的單元
    • 登入後的單元
    • 聊天對話單元
    • 部署指南
    • 常見問題排解
    • 專案故事
    • 最初的那些痛

身份驗證

Valo 以 Agora 服務作為聊天後端&聊天倉儲,我們先了解 Agora Auth 文檔 ,要求 Client 必須經過自架 Toke API Server,簽發出 Agora User Token,目前 Valo 的 Token API Server 為 C# 後端程式。

  • Valo Server: 身份驗證資料
    • Agora User Token - Client 使用 Agora SDK 登入用。 (期效:7 天)
    • Valo JWT Token - 與 Valo Server 溝通時的身份驗證。 (期效:7 天)
    • Valo Refresh Token - JWT Token 過期後,能 refresh JWT Token。(效期:30 天)

備註

方便記取 C# Token API Server 以下使用 Valo Server 作為稱呼。

Valo Server

  1. 頒發 Agora User Token
  2. 頒發 Auth Token (Refresh、JWT)
  3. 群組匿名資料 - 圖片上傳
  4. 幫忙墊 Agora 某些 API,可能在需求上,需要保存其他資料才墊。

Auth 期效:

  1. 登入後,都會一起拿到 User Token, JWT Token 通常要失效會一起失效,盡量一致 7 日、30 日,後端能調整兩個日期,需要再跟 C# 說。
  2. 盡量一起失效,一起 Refresh,才比較不會有其他例外異常。

Valo 登入驗證流程

上圖為 Valo APP 驗證的三種情況, 登入、即將過期、自動登入的情況需要特別說明

  1. 登入:

    • Valo API - Login API OK。 (會得到 3 個 Token)
    • Agora SDK SDK Login OK。
    • 這時候會將這 3 個 Token 保存到自己的裝置 Storage。
      • 為了下次自動登入而存。

    登入機制

    程式碼區段: login_form.dart:::_doLogin 登入邏輯這邊,邏輯細節我這邊以下解釋

    • 兩個都登入成功後,身份資訊記憶到 SecureStorage (安全加密的 Storage)。
    • 設定 Dio Header: Bearer Token,因為後續在請求 Valo API 其他部分 API,有身份保護。
    • hasDeleteMark 是登入後,這個人是不是 刪除過帳號,恢復登入 (死灰復燃),需求上會需要彈跳 歡迎回來的彈窗。
    • 登入後,取的當前的用戶資料(Profile)。
    • 注意!注意!注意!注意!注意!
    • 在登入後,有做一段 訊息資料同步 的動作(AgoraSyncService::syncAll)
    • 清空裝置資料,再遠端同步訊息,如果用戶訊息多,會感覺登入越久,這段有敘述給 PM,之後有可能會需要改善。
      • 建議未來改良成,登入不同步,但多做一個 button,讓使用者被動式的觸發這件事情。
      • 缺點:所以登入後可能都是空資料。
      • 調整方向:如果要把同步資料這段取消掉,只要把 AgoraSyncService::syncAll 去除掉,然後移動到其他按鈕元件即可
  2. Will Expired:

    Agora Auth 中,有提供 onTokenWillExpire的事件,我們能利用這件事情去做,refresh token 的身份驗證的替換&記憶,但用戶並不會感覺的到替換過。

    Token 即將失效

    程式碼: AuthService::setupChatTokenExpireCallbackForTopicGuard,可能會好奇為何是掛在 TopicGuard,經過這段時間觀察,發現 APP 生命週期、Valo 操作模式兩個梳理下來,任何情況都會經過大廳 所以才會掛在 TopicGuard 較統一,比較不用各種時機掛上。

    1. APP 啟動 -> 登入 -> 大廳
    2. APP 重新啟動 -> 登入 -> 大廳
    3. APP 刷到背景 -> 回來大廳 -> Callback 依然存在
    4. APP 刷到背景 -> 直接刪掉 -> 打開 APP -> 自動登入 -> 大廳

    ...

  3. APP重啟,記憶之自動登入

    當 Valo 曾經有登入後,依照前面 登入 ,我們記憶了身份驗證資料,而這時我們重啟 APP 時,會做一段 Auto Login 的動作。

    自動登入

    程式碼: ValoAplication::autoAuth 這段就是自動登入的邏輯。

  4. APP放置背景時,暫時登出,讓 Agora 認為使用者目前暫時登出

    這件事情是為了實現 離線推播,因為用戶把 APP 滑到背景,直覺理應要收到新訊息的通知,經過實測後,APP 放置背景並沒有收到離線新消息。

    離線推播 例外身份驗證

    程式碼:ValoApplicationHooks::whenHidden 當 APP 進入背景前的回呼,裡面會實作 裝置暫時登出, 程式碼:ValoApplicationHooks::whenwhenResumed 當 APP 恢復前台回呼,裡面會實作 Agora 登入。

  5. APP 登出、 刪除帳戶

    登出就比較單純,把相關身份資料、監聽事件都註銷掉,剩下都是 UI 的邏輯。 (目前有些身份驗證的例外狀況下,沒有處理好,可能會造成使用到上一位用戶的狀況)

    登出、刪除帳戶

    • 手動登出: logout_popup.dart
      • 清空 資料池,讓下次登入有乾淨的資料池使用。
      • 關閉 Agora 相關的監聽
      • IOS 的 APP 數字歸 0
    • 刪除帳戶: delete_user_button.dart
最後更新: 2025/8/21 上午10:09
貢獻者: boheng
Prev
- 群組目錄
Next
登入前的單元