现在的问题是如何根据用户系统中的数据验证在客户端应用程序中输入其凭据(用户名/密码)的用户,以确保其安全性和高性能?为了这个问题,假设客户端应用程序是某种Intranet的内部应用程序,但应用程序不会驻留在同一台机器上,只能通过该服务进行通信。
我理解让应用程序“超媒体驱动”的想法,但我们应该能够提供过滤/搜索服务。例如,请考虑以下资源和API:
基于以上所述,我的想法是在用户列表中使用客户端应用程序GET,按用户名进行过滤。该服务将哈希密码和salt返回给客户端,客户端将执行身份验证。
思想?
答案 0 :(得分:6)
如果我正确理解您的问题,您希望实现一个处理身份验证的通用服务,以便您可以将其重用于不同的应用程序。
我建议你看看OAuth,它是为这个问题域而构建的。
答案 1 :(得分:4)
传递用户名和盐是不必要的,这是一个真正的安全风险。
也许您可以考虑这种方法:
让客户通过Basic Authentication
将用户名和密码传递给服务器服务器使用salt
获取用户名的加密密码服务器使用某种加密方法加密给定的密码,使用salt来协助算法(遵循Ruby代码):
def User.authenticate(login, password)
ok = false
user = User.find_by_login(login)
if user
#
# user contains the salt, it isn't passed from the client
#
expected_password = hash_password(password, user.salt)
ok = (user.password == expected_password)
end
return ok
end
有很多地方可以使用这种方法,但我喜欢在Rack中进行。
最后一点,在HTTPS连接上完成所有操作
答案 2 :(得分:4)
Stormpath公司致力于为开发人员提供用户登录管理API和服务。他们使用REST JSON方法。
还有一些其他公司似乎涉足这个新的认证即服务领域,但Stormpath是我所知道的唯一致力于它的公司。
答案 3 :(得分:3)
首先,您不希望客户端执行身份验证,因为编写一个破坏您服务的客户端会很简单。
相反,只需使用HTTP Basic或HTTP Digest等身份验证机制即可。
请注意,如果您使用的是Java,Restlet框架会提供名为Guards的拦截器,它们支持这些和其他机制。我强烈推荐Restlet。
答案 4 :(得分:0)
自此问题发布以来,Mozilla Foundation(Firefox浏览器的制造商)已经解决了简单用户身份验证的问题。他们的解决方案是Mozilla Persona,“Web的登录系统”。旨在让开发人员轻松为用户和。用户的身份是电子邮件地址。请参阅Wikipedia article。
Mozilla基本上放弃了Persona的工作但not quite killed项目。