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

Bru*_*uno 57 javascript security authentication cookies angularjs

我是angularjs的新手......

我阅读了文档,并完成了教程; 我自己也试过别的东西,事情开始对我有意义.

现在我想知道如何建立一个安全的身份验证系统.

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

我有一个经典的表单:用户名和密码文本输入.

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

一个ajax请求开始,响应是一个JSON告诉我类似"我知道你好"或"我不知道你是谁"的东西.

我现在需要的是在我的应用程序的不同视图之间保留访问者的记录状态(或不记录).

我在互联网上读到,要实现这一目标,有人设置变量($ scope.isLogged = true),其他人使用cookie; 但是javascript变量和cookie可以使用firebug或类似的开发工具轻松编辑.

......最后问题是:

那么,您有什么建议在angularjs应用程序中实现安全的身份验证系统吗?

fdr*_*ger 54

您无法在angularjs中授权任何内容,因为用户可以完全控制执行环境(即浏览器).每个检查,案例,如果 - 您能想到的任何事情 - 都可以被篡改.有些javascript库使用非对称密钥来执行本地加密,以便在某种程度上安全地存储本地数据,但实际上它们并不是您所需要的.

您可以,并且您应该在服务器上授权 - 使用会话在普通应用程序中执行此操作的标准方法; 不需要特殊代码,ajax调用使用普通会话cookie.应用程序不需要知道它是否经过身份验证.它只需要检查服务器的想法.

从angularjs应用程序的角度来看,"登录"或"注销"仅仅是用户的一个提示.

  • +1,特别是"从你的angularjs应用程序的角度来看,"登录"或"退出"仅仅是对用户的一个启示." 如果用户想要篡改他们的执行环境,使得Angular认为他们已经登录,那么就这样 - 只要服务器仍然验证任何改变实际数据的操作,等等. (15认同)

Ale*_*u R 47

可能你找到了一个解决方案,但目前我已经制定了一个我在Angular App中实现的认证方案.

在.run上,应用程序注册时ActiveSession设置为false.然后它检查浏览器是否有带令牌和userId的cookie.

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

如果NO显示登录表单,请检查凭据,如果它们有效则再次检查凭据是否服务器请求获取新令牌并且保存在本地.

令牌用于进行持久登录(记住我3周)或用户刷新浏览器页面时.

谢谢

Angular.js中的身份验证方案


Bru*_*uno 18

三个月前我问了这个问题.

当我在AngularJS构建的Web应用程序中处理用户身份验证时,我想分享我最喜欢的方法.

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

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

从angularjs应用程序的角度来看,"登录"或"注销"仅仅是用户的一个提示.

所以,简单地说,我的方法包括:

1)将每条路线的附加信息绑定到路线本身.

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

2)使用服务来保存每个用户的数据及其身份验证状态.

services.factory('User', [function() {
    return {
        isLogged: false,
        username: ''
    };
}]);
Run Code Online (Sandbox Code Playgroud)

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
})
Run Code Online (Sandbox Code Playgroud)

我还在我的博客上写了这个方法(更详细),用户使用angularjs进行身份验证.