2017-09-08 149 views
1

我正在研究一個需要用戶登錄才能使用它的應用程序。用戶只能連接到互聯網時才能登錄。用戶登錄時,應在設備上存儲令牌,允許在不登錄的情況下脫機使用應用程序。我基本上想檢查這個令牌是否存在,如果是,則將用戶帶到應用程序中,否則就是登錄屏幕。此外,此令牌應在一段時間後過期。存儲用於脫機身份驗證的令牌

問題是,如果有一種方法可以存儲令牌,例如24小時後,用戶無法以任何方式篡改或誘騙系統(例如令牌爲時間戳和用戶更改設備時間)。令牌應在用戶未連接到互聯網的情況下過期,以便用戶無法永久使用該應用程序,而無需每隔一段時間重新進行一次認證。

雖然看起來很簡單,但我一直無法找到這個問題的答案。我研究過OAuth和NSHTTPCookie等技術,但這些看起來與在線身份驗證有關,而我試圖在脫機環境中對用戶進行身份驗證。

+0

可行的,但有一些題。您是否要使用存儲的令牌在連接到網絡時在服務器上發送?您可以使用鑰匙串保存憑證並將上次登錄時間保存在Userdeafult(適合您)。在下次登錄之前,將上次登錄時間與24小時進行比較。如果小於yes,則允許訪問其他Keychain的刪除憑證。 –

+0

謝謝你的回覆。不,在令牌過期之前,我不會再與服務器進行身份驗證。令牌由服務器簽名,用於在24小時內對用戶進行認證和授權。即使用戶有互聯網訪問權限,如果存在有效的令牌,我也不想連接到服務器。 –

+0

非常適合鑰匙扣。最佳&安全。 –

回答

0

您可以使用鑰匙串,這將是最安全的選擇。

你可以使用「SwiftKeychainWrapper」

當用戶驗證>>保存令牌鑰匙圈和時間戳。

​​

離線驗證用戶密鑰和時間戳組合,以檢查是否給予用戶訪問...

let authToken: String? = KeychainWrapper.standard.string(forKey: "authKey") 
let timeToken: String? = KeychainWrapper.standard.string(forKey: "timeKey") 

後的時間到了剛剛從鑰匙串刪除...

+0

我應該如何比較時間戳?如果我將它與設備時間進行比較,用戶是否可以簡單地將時鐘恢復到延長會話時間?連接到服務器以獲得時間不是一種選擇。 –

+0

是的,這很難解決,所以有很多這方面的帖子... 你可以讓你自己的系統考慮當地時間,服務器時間(第一認證),運營商時間,CPU時間(系統重新啓動時重置)和操作系統通知。 ...你可以阻止用戶,如果你發現有趣的事情... 事情是沒有直接的解決方案,這個問題.... 你可以參考下面SO帖子 https://stackoverflow.com/questions/34627791/accurate-time-detection-while-offline https://stackoverflow.com/questions/23801484/ios-time-change-notification - 和 - 前一時間的 – Abhishek

相關問題