【问题标题】:Secure Access to Authenticated REST Server through Backbone.js?通过 Backbone.js 安全访问经过身份验证的 REST 服务器?
【发布时间】:2011-11-09 23:29:17
【问题描述】:

我有这个由简单的 HTTP 身份验证保护的 REST 服务器(由我自己编写)。

现在我使用backbone.js 重新编写了应用程序,但我不确定如何对我的客户端进行身份验证。如果我在 JS 中执行此操作,用户/密码将可见。

那么我应该如何修改我的服务器或客户端 JS 以确保安全?

之前我只是给用户并在 PHP 中为每个对 REST 服务器的请求传递,请指导我,谢谢。

【问题讨论】:

    标签: javascript rest backbone.js


    【解决方案1】:

    HTTP Basic 身份验证容易受到窃听和中间人攻击。建议使用 HTTPS。

    但是,如果这不是一个选项,您可以随时将 cookie 发送回客户端并在此处输入用户名/密码,以防止其显示在 JS 文件中。不言而喻,出于安全原因,密码至少应该被加密/散列。然后,服务器端有责任从 cookie 中获取身份验证详细信息。

    现在,如果您对修改服务器端代码没有任何控制权,那么您几乎别无选择,只能将凭据详细信息隐藏在全局 ajaxSend() 方法中,该方法将发送用户名/密码详细信息每个 AJAX 请求。您可以将其放在其他一些 .js 文件中并使其难以找到,但您几乎受限于这种安全形式。虽然,cookie 不会让你的生活更安全。 (如果密码被散列/加密就好了)。

    你可以做的另一件事是有一个稍微复杂的安全形式:让服务器在每个响应中发送一个随机数——随机数将由服务器使用服务器的密钥“签名”,你可以使用为每个请求“加密”客户端的用户名/密码。然后,您的服务器将不得不不断解密凭据。这不太容易出现中间人,但仍然不是万无一失的。

    如果您可以选择,HTTPS 可以让您免于上述各项。

    希望这会有所帮助。

    更新 (根据评论): restful-ness 的本质是服务器上没有状态。即,没有会话!因此,您需要在客户端向服务器发出的每个请求中发送用户凭据。如果您有一个登录页面,那么很难真正放松,因为没有称为登录的“资源”。但是,您可以执行以下操作:

    1. 用户访问登录页面,输入凭据并点击“登录”
    2. 使用这些凭据向服务器发送 POST 请求 - 可能是 /Login
    3. 让服务器返回需要身份验证的请求资源,并使用有效凭据设置 cookie 以在“下一个”请求中使用
    4. 每个后续请求都将通过特定操作(GET、PUT、POST、DELETE...)定向到特定 URL 处的相应资源。服务器应检查 cookie 中的身份验证数据,并确定用户是否已通过身份验证,并在需要时执行进一步授权以授予访问权限。

    每个请求都必须在不让服务器维护会话的情况下识别自己——这就是无状态(和宁静;)的精神。

    【讨论】:

    • 感谢您的深入概述,它肯定会有所帮助。但是,很抱歉我忘了提及(现在编辑问题)我可以完全访问服务器并且我可以更改它,以便我的设置是万无一失的。对此有何建议?如果你愿意,你可以写另一个答案或编辑它。
    • @BlackDivine - 相同的步骤:) 我已经展示了 3 种方法 - 仅客户端 (ajaxSend)、仅服务器 (cookie) 和混合 (使用服务器随机数进行恒定加密/解密)
    • 我目前最喜欢 Cookies 选项,您能确认一下这个方法更好吗?我们在服务器上创建会话,每当用户成功登录时,会话就会在其余服务器上创建,只要会话处于活动状态,用户就可以使用 REST API。现在将通过 ajax 发送登录 POST 将为服务器或我的网站上的用户创建会话?因为我有 2 台服务器,所以 1 台是 REST 另一个运行主干应用程序的主机网站。非常感谢!
    • 您能在@Nupul 下方阅读我的回答吗?并给我您的反馈?
    • 我不得不查找“nonce”,这个词在英国的含义非常不同!
    【解决方案2】:

    好的,我与同事讨论并提出了迄今为止最好的主意:

    在您的客户端(站点)中创建一个简单的控制器并将其命名为 RESTAPI,它将充当您实际 REST 服务器的包装器。

    当用户登录您的网站时,他的会话就创建好了。 RESTAPI 控制器知道您的 HTTP Authed 实际 REST 服务器的凭据,并代表骨干网访问 REST 服务器。

    示例:如果我必须获取

    /消息/发送

    来自 REST 服务器,现在我将在骨干集合中点击此 url

    站点/restapi/消息/发送

    RESTAPI 控制器还首先检查请求用户在站点上是否有适当的会话,以及是否允许他获取资源。

    所以不用担心不安全的 cookie 或让您的 REST 服务器以纯 JS 传递或使用任何其他晦涩的方法 :)

    【讨论】:

    • 这不会破坏服务器的整个 RESTFULness 吗?我的意思是,如果您要走那条路线,也可以只在服务器上进行会话处理。不要误会我的意思,如果我每次都通过凭据,我仍然一无所知,将它们存储在客户端以每次都通过不一定是最聪明的主意。
    • 在每个请求中传递凭据并没有错。在 REST 中,每个请求都应该是可自我描述的(为了消除服务器中会话的需要)。如果资源受到保护,则凭证是请求“描述”的一部分,因此应与它一起发送。您可以只询问用户他的凭据并在每个后续请求中传递它们。对于 OP,请不要使用会话。你正在用它破坏 REST 的美。您不需要会话,并且不使用会话可以使您的系统更具可扩展性。
    • 您能否提供一个您为此实现编写的backbone.js 代码示例?我在让它工作时遇到问题。你可以在this question看到我的进度
    【解决方案3】:

    如果您有权访问服务器端 REST 代码,则可以重新设计 REST 身份验证。第一次登录时,您通过 https 发布用户名/密码,然后获取一个会话 ID,该会话 ID 可用于将其作为 cookie 传递的后续请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      相关资源
      最近更新 更多