RESTful 用户认证服务
Posted
技术标签:
【中文标题】RESTful 用户认证服务【英文标题】:RESTful user authentication service 【发布时间】:2011-01-02 08:52:09 【问题描述】:大家好,这似乎经常被讨论,但我想提出一个简单的、淡化的问题,围绕使用 RESTful 服务进行身份验证。场景如下:
有一个系统可以容纳应用程序的注册用户。系统公开了一个 RESTful API 来访问这些用户。 有一个具有登录表单的前端应用程序。应用程序可以是内部的,也可以是外部的。 前端应用程序需要使用用户系统中的数据来对用户进行身份验证。现在的问题是如何根据用户系统中的数据对在客户端应用程序中输入凭据(用户名/密码)的用户进行身份验证,以使其安全且高效?对于这个问题,假设客户端应用程序位于某种 Intranet 的内部,但应用程序不会驻留在同一台机器上,并且只能通过服务进行通信。
我理解让应用程序成为“超媒体驱动”的想法,但我们应该能够提供过滤/搜索服务。例如,考虑以下资源和 API:
http://example.com/users GET - 检索所有用户(分页、超媒体驱动) POST - 创建新用户 不支持 PUT/DELETE http://example.com/users/[id] GET - 返回具有 id = id 的用户的完整表示 PUT - 更新用户,接受任何预定义的媒体类型 DELETE - 删除用户(通过适当的授权) 不支持 POST基于上述,我的想法是让客户端应用程序在用户列表中获取,按用户名过滤。服务将哈希密码和盐返回给客户端,客户端将执行身份验证。
想法?
【问题讨论】:
您能否更具体地说明问题是什么?我很难理解您想要什么样的反馈。 【参考方案1】:如果我正确理解您的问题,您正在寻求实现一个通用服务来处理身份验证,以便您可以将其重新用于不同的应用程序。
我建议你看看OAuth,它正是为这个问题领域而构建的。
【讨论】:
【参考方案2】:传回用户名和盐是不必要的,而且存在真正的安全风险。
也许你可以考虑这种方法:
让客户端通过Basic Authentication将用户名和密码传递给服务器
服务器获取用户名的加密密码和盐
服务器使用某种加密方法加密给定的密码,使用盐来辅助算法(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 连接上完成所有操作
【讨论】:
【参考方案3】:风暴路径
Stormpath公司致力于为开发者提供用户登录管理API和服务。他们使用RESTJSON 方法。
还有一些其他公司似乎涉足了这一新的身份验证即服务领域,但 Stormpath 是我所知道的唯一一家致力于此领域的公司。
【讨论】:
【参考方案4】:首先,您不希望客户端执行身份验证,因为编写一个闯入您的服务的客户端将是微不足道的。
相反,只需使用HTTP Basic 或HTTP Digest 之类的身份验证机制。
请注意,如果您使用 Java,Restlet 框架会提供拦截器,称为 Guard,它支持这些机制和其他机制。我强烈推荐 Restlet。
【讨论】:
【参考方案5】:Mozilla 角色
自从这个问题发布以来,Mozilla Foundation(Firefox 浏览器的制造商)已经承担了简单用户认证的问题。他们的解决方案是Mozilla Persona,“Web 登录系统”。旨在方便用户和开发人员。用户的身份是电子邮件地址。见Wikipedia article。
更新
Mozilla 基本上放弃了 Persona 的工作,但 not quite killed 项目。
【讨论】:
以上是关于RESTful 用户认证服务的主要内容,如果未能解决你的问题,请参考以下文章