題目與使用情境
企業客戶把你的 SaaS 作為服務提供者,身分提供者會傳送使用者和群組變更。同步可能重複、亂序、延遲或在網路逾時後重試。系統需要支援多租戶、使用者外部識別、群組成員關係、軟刪除、稽核和即時撤銷,同時遵守 SCIM 2.0 的資源與錯誤語意。
面試官考察什麼
- 是否熟悉 SCIM User、Group、
schemas、篩選查詢和 PATCH 語意。 - 能否把外部資源映射、冪等鍵、並發更新和重試設計成一致的資料流。
- 是否區分
active=false的停用、刪除請求和應用程式內工作階段撤銷。 - 是否能落實租戶隔離、令牌權限、稽核、速率限制和敏感欄位保護。
作答前的釐清問題
先確認身分提供者是否是使用者資料的權威來源、是否要求群組推送、是否允許真正刪除、同步延遲目標和每租戶規模。再確認外部 userName 是否穩定、是否存在電郵改名、群組成員數量上限、是否需要批量介面,以及停用後現有登入工作階段必須多久失效。不要把電郵當作永遠不變的主鍵。
30 秒回答框架
我會按租戶保存 SCIM 外部資源與本地帳戶的映射,資源用穩定的外部識別和內部 ID 分離。建立、更新、PATCH、刪除和查詢都做冪等,記錄請求指紋與版本,衝突按條件更新或返回明確錯誤。active=false 觸發停用和工作階段撤銷,刪除策略按租戶保留期執行。所有請求驗證租戶、令牌範圍和稽核鏈,非同步副作用使用可重試佇列且不重複發放權限。
分步驟深入解答
- 確定資源邊界。 暴露
/Users、/Groups、/ResourceTypes、/Schemas和/ServiceProviderConfig等能力時,明確實際支援的欄位和操作。回應中的schemas必須與資源類型一致,不支援的篩選操作返回規範化錯誤。 - 建立身分映射。 為每個租戶保存外部資源 ID、內部使用者 ID、來源系統和目前版本。
userName、電郵等可變屬性用於查找或顯示,不能取代穩定映射;衝突時拒絕自動合併並進入人工處理。 - 實作冪等與並發控制。 重複 POST 要麼返回既有資源,要麼按外部請求指紋安全重試;PATCH 逐條套用操作並記錄結果。支援
ETag或版本條件時拒絕過期寫入,避免舊事件覆蓋新資料。 - 處理使用者和群組生命週期。
active=false先撤銷應用程式權限、停止新登入並使現有工作階段失效。真正刪除要經過租戶保留策略和稽核;群組成員更新採用集合差異,不能在部分失敗時把未確認成員全部移除。 - 隔離非同步副作用。 API 寫入本地事實表後投遞權限同步、歡迎通知和稽核事件。佇列訊息攜帶租戶、資源版本和冪等鍵;消費者重複執行不應重複授予權限或發送通知。
- 防護與運維。 SCIM 令牌只授予對應租戶和操作範圍,支援輪換、撤銷和到期。限制分頁、篩選和批量大小,記錄成功、拒絕、衝突、重試和停用延遲;日誌脫敏,不記錄完整令牌或敏感屬性。
高品質示範回答
我會把 SCIM API 視為「外部身分源到本地帳戶的同步邊界」。每個租戶都有獨立的令牌、外部資源映射和稽核鏈。User 和 Group 資源保留穩定的外部 ID 與內部 ID,欄位遵守 SCIM schema;不支援的篩選、PATCH 操作或屬性返回策略明確報錯,不靜默猜測。
寫入先落本地事實表,再按資源版本投遞可重試的權限副作用。重複請求透過外部 ID、請求指紋和條件版本保持冪等;過期版本拒絕覆蓋新資料。active=false 觸發權限撤銷、停止新登入並使現有工作階段失效,刪除遵循租戶保留策略。群組更新使用差異計算,部分失敗可重試且不清空未確認成員。觀測包括每租戶同步延遲、衝突率、停用到工作階段失效的時間和死信數量。依據包括 RFC 7643、RFC 7644 與 Okta 的 SCIM 實作指南。
常見錯誤
- 只實作
POST /Users,沒有/ServiceProviderConfig、篩選、PATCH、錯誤類型和分頁契約。 - 用電郵作為唯一主鍵,電郵變更後建立重複帳戶或錯誤關聯舊帳戶。
- 把逾時重試當成新請求,重複發放權限、發送通知或覆蓋較新的屬性。
- 收到
active=false只隱藏使用者,不撤銷令牌、權限和現有工作階段。 - 群組同步失敗時直接清空本地成員,造成短暫網路問題變成大範圍越權或誤刪。
追問及應對
如果身分提供者重複傳送同一個建立請求怎麼辦?
按租戶和外部資源 ID 查找映射,並保存請求指紋或版本。已有資源返回穩定表示;如果請求內容衝突,返回可診斷錯誤並記錄稽核,不靜默覆蓋本地手工修改。
電郵改名時如何保持帳戶連續?
使用外部資源 ID 到內部帳戶 ID 的穩定映射,電郵只作為可變屬性。改名先校驗租戶內唯一性,再更新顯示和登入別名,不能建立新帳戶或憑電郵跨租戶匹配。
停用事件與登入請求同時到達時如何保證安全?
權限檢查讀取可線性化的帳戶狀態或撤銷版本;停用交易提高版本並撤銷工作階段。登入簽發前再次檢查版本,發現已停用則拒絕,即使舊的非同步權限任務尚未完成也不能恢復存取。