2014-01-25 39 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