9

嘿伙计们,这似乎经常被讨论,但我想提出一个简单的、淡化的问题,围绕使用 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 在用户列表中,按用户名过滤。服务将哈希密码和盐返回给客户端,客户端将执行身份验证。

想法?

4

5 回答 5

6

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

我建议您看一下专为这个问题领域而构建的OAuth 。

于 2010-01-08T15:36:10.637 回答
4

风暴路径

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

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

于 2014-02-01T23:24:47.743 回答
4

传递用户名和盐是不必要的,而且是真正的安全风险。

也许您可以考虑这种方法:

让客户端通过基本身份验证将用户名和密码传递给服务器

服务器获取用户名的加密密码和盐

服务器使用某种加密方法加密给定的密码,使用盐来辅助算法(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 连接上完成所有操作

于 2010-01-14T21:17:06.653 回答
3

首先,您不希望客户端执行身份验证,因为这样编写一个闯入您的服务的客户端将是微不足道的。

相反,只需使用HTTP BasicHTTP Digest 之类的身份验证机制。

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

于 2010-01-07T06:06:10.810 回答
0

Mozilla 角色

自从发布此问题以来,Mozilla 基金会Firefox浏览器的制造商)已经着手解决简单用户身份验证的问题。他们的解决方案是Mozilla Persona,“Web 登录系统”。旨在方便用户开发人员使用。用户的身份是电子邮件地址。参见维基百科文章

更新

Mozilla 基本上已经放弃了 Persona 的工作,但并没有完全扼杀这个项目。

于 2014-02-01T23:21:30.463 回答