身份驗證
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
- 頒發 Agora User Token
- 頒發 Auth Token (Refresh、JWT)
- 群組匿名資料 - 圖片上傳
- 幫忙墊 Agora 某些 API,可能在需求上,需要保存
其他資料才墊。
Auth 期效:
- 登入後,都會一起拿到 User Token, JWT Token 通常要失效會一起失效,盡量一致 7 日、30 日,後端能調整兩個日期,需要再跟 C# 說。
- 盡量一起失效,一起 Refresh,才比較不會有其他例外異常。

上圖為 Valo APP 驗證的三種情況, 登入、即將過期、自動登入的情況需要特別說明
登入:Valo API- Login API OK。 (會得到 3 個 Token)Agora SDKSDK Login OK。- 這時候會將這 3 個 Token 保存到自己的裝置 Storage。
- 為了下次自動登入而存。
登入機制
程式碼區段:
login_form.dart:::_doLogin登入邏輯這邊,邏輯細節我這邊以下解釋- 兩個都登入成功後,身份資訊記憶到 SecureStorage (安全加密的 Storage)。
- 設定 Dio Header:
BearerToken,因為後續在請求Valo API其他部分 API,有身份保護。 hasDeleteMark是登入後,這個人是不是刪除過帳號,恢復登入 (死灰復燃),需求上會需要彈跳歡迎回來的彈窗。- 登入後,取的當前的
用戶資料(Profile)。 - 注意!注意!注意!注意!注意!
- 在登入後,有做一段
訊息資料同步的動作(AgoraSyncService::syncAll) - 清空裝置資料,再遠端同步訊息,如果用戶訊息多,會感覺登入越久,這段有敘述給 PM,之後有可能會需要改善。
- 建議未來改良成,登入不同步,但多做一個 button,讓使用者被動式的觸發這件事情。
- 缺點:所以登入後可能都是空資料。
- 調整方向:如果要把同步資料這段取消掉,只要把
AgoraSyncService::syncAll去除掉,然後移動到其他按鈕元件即可
Will Expired:Agora Auth 中,有提供
onTokenWillExpire的事件,我們能利用這件事情去做,refresh token 的身份驗證的替換&記憶,但用戶並不會感覺的到替換過。Token 即將失效
程式碼:
AuthService::setupChatTokenExpireCallbackForTopicGuard,可能會好奇為何是掛在 TopicGuard,經過這段時間觀察,發現APP 生命週期、Valo 操作模式兩個梳理下來,任何情況都會經過大廳 所以才會掛在 TopicGuard 較統一,比較不用各種時機掛上。- APP 啟動 -> 登入 -> 大廳
- APP 重新啟動 -> 登入 -> 大廳
- APP 刷到背景 -> 回來大廳 -> Callback 依然存在
- APP 刷到背景 -> 直接刪掉 -> 打開 APP -> 自動登入 -> 大廳
...
APP重啟,記憶之自動登入當 Valo 曾經有登入後,依照前面
登入,我們記憶了身份驗證資料,而這時我們重啟 APP 時,會做一段 Auto Login 的動作。自動登入
程式碼:
ValoAplication::autoAuth這段就是自動登入的邏輯。APP放置背景時,暫時登出,讓 Agora 認為使用者目前暫時登出這件事情是為了實現
離線推播,因為用戶把 APP 滑到背景,直覺理應要收到新訊息的通知,經過實測後,APP 放置背景並沒有收到離線新消息。離線推播
例外身份驗證程式碼:
ValoApplicationHooks::whenHidden當 APP 進入背景前的回呼,裡面會實作裝置暫時登出, 程式碼:ValoApplicationHooks::whenwhenResumed當 APP 恢復前台回呼,裡面會實作 Agora 登入。APP 登出、刪除帳戶登出就比較單純,把相關身份資料、監聽事件都註銷掉,剩下都是 UI 的邏輯。 (目前有些身份驗證的例外狀況下,沒有處理好,可能會造成
使用到上一位用戶的狀況)登出、刪除帳戶
手動登出: logout_popup.dart- 清空
資料池,讓下次登入有乾淨的資料池使用。 - 關閉
Agora相關的監聽 - IOS 的 APP 數字歸 0
- 清空
刪除帳戶: delete_user_button.dart