39

我开发了一个单页应用程序原型,它在前端使用 Backbone,并从服务器上的瘦 RESTful API 中使用它的数据。

来自繁重的服务器端应用程序开发(php 和 python),我真的很喜欢带有厚客户端 MVC 的新的不同设计方法,但对于如何最好地将应用程序限制为登录的经过身份验证的用户感到困惑。

我更喜欢让应用程序本身在登录之后,并且除了站点的本机登录之外,还希望最终实现其他类型的登录(openid、fb connect 等)。我不清楚这是如何完成的,并且一直在搜索 - 但是没有成功找到让我清楚的信息。

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

用户登录后,如何对 api 请求进行身份验证?我可以存储一个会话,但是如何在 API 调用中检测这个会话,或者是否有一个令牌我必须在每个 API 调用中传递?对此的任何答案将不胜感激!

4

3 回答 3

10

我见过的最 RESTful 方式是基于 OAuth 客户端凭据流,基本上是您发布用户名/密码的 /token 端点,该端点返回此会话的访问令牌。之后的每个 ajax 请求都会附加一个Authorization带有令牌的不记名标头。您可以将令牌存储在全局变量中,以便在页面刷新/关闭之前保留它,使用本地存储来保持用户在会话之间登录,或使用 javascript cookie。如果您不喜欢令牌的想法,那么您可以使用旧的 cookie 方法,无论如何都会自动发送任何 ajax 请求。

至于 facebook/google 等,我通常遵循 stackoverflow 方法,将外部用户登录与帐户相关联。然后使用一个相当普通的基于服务器的 oauth 舞蹈(尽管您可以用 ajax 请求替换所有对服务器的请求,只需稍作修改,我只是发现它并没有太大的区别,因为无论如何您都需要在您和服务器之间进行重定向)。我通常为 facebook 登录发布一个加密的 cookie,然后我使用与上述类似的方法将其转换为令牌(只需发送带有请求而不是用户名/密码的 cookie)。

于 2013-11-06T19:10:03.463 回答
9

我们使用基于 django cookie 的身份验证,并为登录和单页应用程序提供单独的页面。非常适合我们的用例。我们使用了我在这里描述的基于 Backbone 的会话管理系统:backbone.js - 处理用户是否登录

于 2012-09-19T20:58:11.333 回答
4

我们正在使用 Angular.js,并且还有一个单独的登录页面。单独的页面加载单独的单页面(和安全)应用程序,该应用程序使用 http XHR 请求调用服务器,发送用户名和密码。如果服务器对凭据进行了身份验证,则 javascript 代码会设置一个 cookie。此 cookie 可以从“另一端”读取,即非安全应用程序。在 cookie 中,我们只输入用户名,当然,没有密码或其他安全信息。那么我们可以展示类似'Not Lior? 在非安全应用程序上注销。

唯一需要注意的是重写 Angular 的 cookie 机制来设置无限期过期,最重要的是,根路径:

$document[0].cookie = 'username=' + escape($scope.userName) + ";expires=Thu, 01 Jan 2970 00:00:00 GMT; Path=/";
于 2013-04-08T16:15:07.507 回答