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

时间:2012-09-19 19:13:33

标签: javascript authentication backbone.js javascriptmvc single-page-application

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

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

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

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

用户登录后,如何验证api请求?我可以存储会话但是如何在API调用中检测此会话,或者是否有必须在每次API调用中传递的令牌?任何答案都将非常感谢!

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:7)

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

答案 2 :(得分: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=/";