单页应用程序中用户的身份验证?

40

我开发了一个单页面应用的原型,前端使用了Backbone,后端使用一个轻量级RESTful API来提供数据。

由于之前主要从事服务器端应用程序开发(PHP和Python),所以我非常喜欢这种新的厚客户端MVC设计方法,但是对如何最好地限制应用程序以进行身份验证的用户感到困惑。

我希望将应用程序本身置于登录背后,并且最终还希望实现其他类型的登录方式(OpenID,FB Connect等),除了网站本机登录。 我不清楚这是如何实现的,一直在搜索,但没有找到让我清晰明白的信息。

总体而言,目前注册用户并要求他们登录使用您的单页应用程序的最佳实践是什么?

一旦用户登录,API请求是如何进行身份验证的? 我可以存储会话,但是如何检测API调用中的此会话,或者是否必须在每个API调用中传递令牌? 欢迎任何答案!


3
你最终做了什么?请在现有答案中选择一个解决方案,或添加您自己的解决方案。 - tgkprog
3个回答

10
我见过的最符合RESTful标准的方法是基于OAuth客户端凭据流,基本上是一个/token端点,你可以向它发送用户名/密码,它将返回此会话的访问令牌。 每个ajax请求之后都附加一个带有该令牌的Authorization承载头。您可以将令牌存储在全局变量中,以便直到刷新/关闭页面之前保留它,使用本地存储在会话之间使用户保持登录状态,或者使用JavaScript cookie。如果您不喜欢令牌的想法,那么您可以只使用旧式cookie方法,因为无论如何,它都会自动发送到任何ajax请求中。
至于Facebook / Google等,我通常遵循stackoverflow的方法,将外部用户登录与帐户关联起来。 然后使用一个相当普通的基于服务器的oauth操作(虽然您可以通过轻微修改将所有对服务器的请求替换为ajax请求,但我发现这并没有什么区别,因为您仍然需要在您和服务器之间进行重定向)。 我通常为Facebook登录发出加密cookie,然后使用类似上述方法将其转换为令牌(只需将cookie与请求一起发送,而不是用户名/密码)。

9

我们使用django基于cookie的身份验证,并为登录和单页面应用程序拥有一个单独的页面。对于我们的使用情况来说,效果非常好。我们使用了一种基于Backbone的会话管理系统,我在这里描述了它:backbone.js - handling if a user is logged in or not


1
我做的事情类似于链接中的内容。我有一个仅处理身份验证(登录/注销)的模型,验证服务器端后发送响应。成功或错误回调然后发送一个事件,我的应用程序和视图正在监听。从服务器返回时,我发送一个加密的cookie会话,然后在每个调用中使用它来验证他们是否已经通过身份验证。 - jmk2142
1
@orangewarp:您所描述的听起来非常像(如果不是)我们需要的。我们正在使用knockout.js,而不是backbone.js。您是否可以提供有关如何实现您的解决方案的更多详细信息?也许一些示例代码?谢谢! - lmttag

4
我们正在使用Angular.js,并且为登录设置了单独的页面。该单独的页面加载一个单独的、安全的应用程序,通过http XHR请求调用服务器并发送用户名和密码。如果服务器验证了凭据,JavaScript代码将设置一个cookie。这个cookie可以从“另一侧”读取,也就是非安全应用程序。在cookie中,我们只放置用户名,而不是密码或其他安全信息。然后我们可以在非安全应用程序中显示类似“不是Lior吗?注销”的内容。
需要注意的是,要覆盖Angular的cookie机制以设置无限期到期和最重要的根路径。
$document[0].cookie = 'username=' + escape($scope.userName) + ";expires=Thu, 01 Jan 2970 00:00:00 GMT; Path=/";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接