RESTful用户身份验证服务

时间:2010-01-07 05:31:53

标签: web-services api rest restful-authentication

嘿伙计们,这似乎经常被讨论,但我想围绕用RESTful服务进行身份验证做一个简单的,淡化的问题。方案如下:

  • 有一个系统可以容纳注册用户的应用程序。系统公开RESTful API以访问这些用户。
  • 有一个具有登录表单的前端应用程序。该应用程序可以是内部的,也可以是外部的。
  • 前端应用程序需要使用用户系统中的数据对用户进行身份验证。

现在的问题是如何根据用户系统中的数据验证在客户端应用程序中输入其凭据(用户名/密码)的用户,以确保其安全性和高性能?为了这个问题,假设客户端应用程序是某种Intranet的内部应用程序,但应用程序不会驻留在同一台机器上,只能通过该服务进行通信。

我理解让应用程序“超媒体驱动”的想法,但我们应该能够提供过滤/搜索服务。例如,请考虑以下资源和API:

  • http://example.com/users
    • GET - 检索所有用户(分页,超媒体驱动)
    • POST - 创建新用户
    • 不支持PUT / DELETE
  • http://example.com/users/[id]
    • GET - 返回ID = {id}
    • 的用户的完整代表
    • PUT - 更新用户,接收任何预定义的媒体类型
    • DELETE - 删除用户(具有适当的授权)
    • 不支持POST

基于以上所述,我的想法是在用户列表中使用客户端应用程序GET,按用户名进行过滤。该服务将哈希密码和salt返回给客户端,客户端将执行身份验证。

思想?

5 个答案:

答案 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

Stormpath公司致力于为开发人员提供用户登录管理API和服务。他们使用REST JSON方法。

还有一些其他公司似乎涉足这个新的认证即服务领域,但Stormpath是我所知道的唯一致力于它的公司。

答案 3 :(得分:3)

首先,您不希望客户端执行身份验证,因为编写一个破坏您服务的客户端会很简单。

相反,只需使用HTTP BasicHTTP Digest等身份验证机制即可。

请注意,如果您使用的是Java,Restlet框架会提供名为Guards的拦截器,它们支持这些和其他机制。我强烈推荐Restlet。

答案 4 :(得分:0)

Mozilla Persona

自此问题发布以来,Mozilla FoundationFirefox浏览器的制造商)已经解决了简单用户身份验证的问题。他们的解决方案是Mozilla Persona,“Web的登录系统”。旨在让开发人员轻松为用户。用户的身份是电子邮件地址。请参阅Wikipedia article

更新

Mozilla基本上放弃了Persona的工作但not quite killed项目。