如何在angularjs应用程序中实现安全(!)身份validation系统?

我是新的与angularjs …

我阅读了文档,并完成了教程。 我也尝试了别的东西,事情开始对我有意义。

现在我想知道如何做一个安全的身份validation系统

简单的部分:没有代码,我将描述操作我的代码执行:

我有一个经典的forms:用户名和密码文本input。

用户填写表单,然后按ENTER键。

一个Ajax请求开始,响应是一个JSON告诉我像“好我知道你”或“我不知道你是谁”的东西。

我现在需要的是在应用程序的不同视图之间维护访问者的logging状态(或未logging)。

我在互联网上看到,为了实现这个目标,有人设置了一个variables($ scope.isLogged = true),其他人使用了cookie; 但JavaScriptvariables和cookie可以使用萤火虫或类似的开发工具轻松编辑。

最后是问题:

那么, 你有没有build议在angularjs应用程序中实现安全的身份validation系统?

您无法授权angularjs中的任何内容,因为用户完全控制了执行环境(即浏览器)。 每个检查,案件,如果 – 任何你能想到的 – 都可能被篡改。 有一些JavaScript库使用非对称密钥来执行本地encryption,以便在某种程度上安全地存储本地数据,但它们并不是您正在寻找的内容。

你可以,而且你应该在服务器上授权一些东西,比如你在普通的应用程序中使用的标准方式。 没有特殊的代码是必要的,Ajax调用使用普通的会话cookie。 应用程序不需要知道它是否被authentication。 它只需要检查服务器认为什么。

从您的angularjs应用程序的angular度来看,“login”或“注销”仅仅是用户的一个提示。

可能你find了一个解决scheme,但是目前我已经构build了一个在Angular App中实现的身份validationscheme。

在.run应用程序注册与设置为false的ActiveSession。 然后检查浏览器是否有一个带有令牌和userId的cookie。

如果是,请检查服务器上的令牌+ userId,并更新服务器和本地的令牌(令牌是每个用户唯一的服务器生成的密钥)

如果NO显示login表单,请检查凭证,如果有效,服务器请求将获得新的令牌并保存在本地。

令牌用于进行永久login(记住我3周)或用户刷新浏览器页面。

谢谢

在Angular.js中的认证方案

已经过了3个月,因为我问这个问题…现在我想分享什么已经成为我最喜欢的方法,当我必须处理在angularjs上构build的Web应用程序的用户身份validation。

当然fdreger的答案仍然是一个很好的答案…

您无法授权angularjs中的任何内容,因为用户完全控制了执行环境(即浏览器)。

从您的angularjs应用程序的angular度来看,“login”或“注销”仅仅是用户的一个提示。

所以,简单地说我的方法在于:

1) 绑定到每个路由有关路由本身的附加信息。

$routeProvider.when('/login', { templateUrl: 'partials/login.html', controller: 'loginCtrl', isFree: true }); 

2) 使用服务来维护关于用户的数据和他的authentication状态。

 services.factory('User', [function() { return { isLogged: false, username: '' }; }]); 

3) 每次用户尝试访问新路由时,检查他是否有访问权限。

 $root.$on('$routeChangeStart', function(event, currRoute, prevRoute){ // prevRoute.isFree tell me if this route is available for all the users, or only for registered user. // User.isLogged tell me if the user is logged }) 

我还在我的博客上写了这个方法(更详细的), 用angularjs进行用户authentication 。

首先:客户端数据总是可以被操纵或篡改。

只要有效的会话ID不容易被猜测,像将会话令牌与客户端IP关联在一起的措施就没有什么大不了的。

理论上,只要你在服务器端这样做,你也可以encryptioncookie。

有关如何encryptioncookie的详细信息,请参阅服务器端的文档(例如,Express.js的http://expressjs.com/api.html#res.cookie

你需要了解它的服务器端/数据库端。

用户login需要存储在某个地方 – 这是服务器端数据库的99.9%。

理想情况下,对于一个真正安全的系统,你需要一个后端(服务器端)成员系统,将会话存储在与保存encryption密码的成员表相关的数据库表中,还提供了一个RESTful接口,可以在其中构buildAPI调用至。

我成功使用的一个脚本是成员https://www.amember.com/ 。 这是一个非常经济实惠的方法,虽然有很多其他的脚本,我已经有了很多成功的这一个..这也是PHP,所以你可以build立你的angular度http调用API的build设真的容易。

所有这些javascript框架都很棒,但效果是,现在有太多的人关注于前端 – 学习数据库/后端也是如此! 🙂