2014-01-25 34 views
2

我試圖通過Worklight實現以下功能。工作燈在線+脫機驗證

  1. 我的應用程序有兩套功能。只有當應用程序連接到服務器並且用戶已通過身份驗證時纔可以訪問一組功能。另一組功能可以脫機訪問,但它們需要來自加密JSONStore的數據。
  2. 我在使用密碼初始化的客戶端設備上有一個JSONStore。因此,商店中的數據將被加密。此外,此JSONStore通過適配器同步到服務器上的數據庫。
  3. 我還設置了另一個適配器,它使用另一組存儲在數據庫中的憑證對用戶進行身份驗證。用戶只能在應用程序在線時進行身份驗證。

我想要做的就是統一這兩種方法,以便用戶不必輸入兩組憑證即可訪問這兩組不同的功能。我想到的一個可能的解決方案就是加密JSONStore並在沒有用戶介入的情況下執行適配器身份驗證。但我不認爲這是安全的。

任何建議或方法來解決這個問題?

回答

2

以下只是一個想法,我不是安全專家。

要求:

  • 要使用的離線功能,您必須一直在網上和認證至少一次。
  • 您的應用程序必須具有登錄視圖才能輸入某些憑據(例如用戶名/電子郵件和密碼)。

步驟:

  1. 用戶第一次輸入正確的憑據,併成功地與服務器驗證:哈希憑據。例如:var myHash = md5(loginField.getUser() + loginField.getPassword())。你可以找到md5 JavaScript libraries on Github
  2. 使用該散列來初始化商店。例如:WL.JSONStore.init(..., {password: myHash})
  3. 通過HTTPS發送哈希到後端,如果用戶更改他/她的憑據,您將需要它。無需將憑證或散列保存在設備上(loginField = null; myHash = null)。或者,您可以在服務器上生成哈希並存儲它,而不需要客戶端將其發回,只需確保客戶端和服務器都使用相同的哈希算法。
  4. 脫機工作時,詢問用戶的憑據,對其進行散列並使用它訪問商店內的數據。
  5. 如果用戶更改他/她的憑據(例如通過您的應用程序的Web界面),哈希將會不同並且存儲將不會初始化。但是,用戶應該已經使用新的/有效的憑證成功地向服務器進行了身份驗證。向服務器請求舊的散列值,使用舊的散列值初始化存儲區,然後根據新的/有效的憑據更改密碼,以將存儲初始化爲新的散列值。例如:WL.JSONStore.changePassword(oldHash, newHash)

可選:您可能要考慮使用salt。例如:var salt = Math.random(), myHash = md5(loginField.getUser() + loginField.getPassword() + salt)

您需要將salt存儲在某處,以便在用戶返回到應用程序後重新生成散列。您應該能夠啓動另一個未加密的商店來堅持它。例如WL.JSONStore.init(..., {username: 'metadata'}).then(function(){/*add salt to store*/})。有關使用兩個商店的更多信息here

+0

我認爲這是方法足以解決我的問題。當應用程序處於脫機狀態時,用戶無法更改其憑據,但沒關係。我個人認爲Worklight應該爲這個問題提供了更優雅的解決方案。謝謝。 – Chandrahas

+0

你能告訴我如何從我的客戶端發送HTTPS請求嗎?或者Worklight是否會通過HTTPS自動執行所有通信? – Chandrahas

+1

如果您對HTTPS支持感興趣,建議閱讀您正在使用的Application Server的文檔。例如:[爲Liberty配置文件啓用SSL通信](http://pic.dhe.ibm.com/infocenter/wasinfo/v8r5/index.jsp?topic=%2Fcom.ibm.websphere.wlp.nd.doc% 2Fae%2Ftwlp_sec_ssl.html)。 – cnandreu