2010-01-07 81 views
8

嘿伙计们,这似乎一直在讨论相当频繁,但我想做一个简单的,淡化的问题围绕使用RESTful服务进行身份验证。场景如下:RESTful用户认证服务

  • 有一个系统,为注册用户提供一个应用程序。系统公开用于访问这些用户的RESTful API。
  • 有一个具有登录表单的前端应用程序。应用程序可以是内部的,也可以是外部的。
  • 前端应用程序需要使用用户系统中的数据来认证用户。现在

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

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

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

基于上述,我的想法是在客户端应用程序中获取用户列表,通过用户名进行过滤。该服务将把散列的密码和salt返回给客户端,客户端将执行认证。

想法?

+1

你能更具体地说明问题是什么吗?我很难理解你想要什么样的反馈。 – 2010-01-07 05:38:38

回答

3

首先,您不希望客户端执行身份验证,因为写入客户端可能会影响您的服务。

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

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

6

如果我正确理解你的问题,你正在寻求实现一个通用服务来处理身份验证,以便你可以重用它用于不同的应用程序。

我建议你看看OAuth,它已经为这个问题领域而精心打造。

4

传递用户名和盐返回是不必要的,并且是一个真正的安全风险。

也许你可以考虑这个方法:

已在客户端通过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连接

0

Mozilla的假面

因为这个问题被张贴,在Mozilla Foundation(在该Firefox浏览器的制造商)已经采取了简单的用户身份验证的问题上。他们的解决方案是Mozilla Persona,“Web的登录系统”。旨在方便开发者的用户。用户的身份是一个电子邮件地址。见Wikipedia article

更新

Mozilla已经基本放弃工作的假面,但not quite killed项目。

4

Stormpath

Stormpath公司致力于为开发者提供用户登录管理API和服务。他们使用RESTJSON的方法。

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