有关REST和Backbone的身份验证工作流程的问题

时间:2013-01-29 17:50:36

标签: rest symfony backbone.js

我目前正在使用Backbone.js构建的网站。该站点有一个使用FOSRestBundle在Symfony中构建的RESTful API。开发进展顺利,直到我偶然发现了一些与用户相关的门票。

据我所知,处理此类问题的最佳方法是使用基于令牌的系统,用户在获得批准的登录后获取访问令牌。我将描述我目前对工作流程的看法,并在此过程中提出问题。更重要的是,如果我误解了,请纠正我。

首先,用户访问登录表单,然后用户键入凭据,并将AJAX请求发送到服务器。根据我的理解,这应该全部用SSL处理,但是使用Backbonejs,你不能简单地说应该使用HTTPS访问登录页面,因为Backbone是一个单页框架。那么这会迫使我在应用程序中使用HTTPS吗?

在下一步中,REST服务器验证凭据,并且它们被批准,然后REST服务器将访问令牌发送到客户端。此令牌是在本地存储还是cookie中保存(在客户端)?

此外,登录是否存储在服务器上,以便REST服务器可以在一定时间后将用户注销?

现在,客户端发送此访问令牌以及其他请求,以便服务器可以识别客户端,并批准请求。那么访问令牌也存储在REST服务器上?

最后,智能人士称之为“oauth”,还是与之相关?

谢谢。

1 个答案:

答案 0 :(得分:6)

让我们一次提出一个问题。

  
    

根据我的理解,这应该全部用SSL处理,但是使用Backbonejs,你不能     简单地说,应该使用HTTPS访问登录页面,因为Backbone是一页的     框架。那么这会迫使我在应用程序中使用HTTPS吗?

  

好的,那里有很多需要打开的东西。让我们从SSL / HTTPS开始吧。 HTTPS是协议;换句话说,它定义了如何向/从服务器发送数据包。它与您的应用程序是单页还是多页没有任何关系;任何类型的站点都可以使用HTTP或HTTPS。

现在,据说,通过HTTP发送登录信息(或其他任何包含密码的信息)是一个非常糟糕的主意,因为它使“坏人”很容易窃取用户的密码。因此,无论您是在进行单页还是多页应用,都应该在发送登录信息时始终使用HTTPS。由于必须同时支持HTTP和HTTPS是一件痛苦的事情,并且由于其他非登录数据也可能是敏感的,因此许多人选择通过HTTPS完成所有请求(但是你没有拥有 to)。

因此,为了回答您的实际问题,Backbone并没有强迫您使用HTTPS进行登录;保护用户密码迫使你。

  
    

在下一步中,REST服务器验证凭据,然后批准它们     REST服务器向客户端发送访问令牌。这个令牌是否已保存(在     客户端)在本地存储或cookie?

  

虽然任何给定的框架可能采用不同的方式,但绝大多数使用cookie来在本地保存令牌。由于各种原因,它们是这类事物的最佳工具。

  
    

此外,登录存储在服务器上,以便REST服务器可以将用户注销     经过一段时间后?

  

你有一个基本的正确的想法,但服务器并不完全存储登录...它更像是服务器登录用户并创建一个“会话”。它为该会话提供一个ID,然后每当用户发出一个新请求时,会话ID随请求一起提供(因为这就是cookie的工作方式)。然后,服务器可以说“哦,这是Bob的会话”,并为Bob提供适当的内容。

  
    

现在,客户端发送此访问令牌以及其他请求,以便服务器可以     识别客户端,并批准请求。因此也存储了访问令牌     在REST服务器上?

  

如果您正在运行两个独立的服务器,那么它们就不会神奇地进行通信;你必须让他们互相交谈。因此,如果您可以为整个应用程序配备一台(可能是REST-ful)服务器,那么您的生活会更轻松。如果你不能,那么你的REST服务器每次收到请求时都要问你的其他服务器“嘿告诉我关于session SESSION ID ”。

  
    

最后,智能人士称之为“oauth”,还是与之相关?

  

有点,有点,不是真的。 OAuth是一种授权标准,因此它与切向相关,但除非您的登录系统涉及整个单独的服务器,否则您没有理由使用它。你可能使用OAuth来解决你的“两台服务器,一台REST-ful one not”问题,但这可能是过度的(而且不管它在我的解释范围之外的Stack Overflow)交)。

希望有所帮助。