58

我是angularjs的新手...

我阅读了文档,并完成了教程;我自己也尝试了其他东西,事情开始对我有意义。

现在我想知道如何制作一个安全的身份验证系统

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

我有一个经典的形式:用户名和密码文本输入。

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

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

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

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

...最后是问题:

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

4

5 回答 5

55

您不能在 angularjs 中授权任何东西,因为用户可以完全控制执行环境(即浏览器)。每张支票,每一个案例,如果——任何你能想到的——都可以被篡改。有一些 javascript 库使用非对称密钥来执行本地加密以稍微安全地存储本地数据,但它们并不是您真正想要的。

你可以而且你应该在服务器上授权——这是你在普通应用程序中做的标准方式——使用会话;不需要特殊代码,ajax 调用使用普通会话 cookie。应用程序不需要知道它是否经过身份验证。它只需要检查服务器的想法。

从您的 angularjs 应用程序的角度来看,“登录”或“注销”只是用户的 gui 提示。

于 2013-02-09T22:44:01.470 回答
47

可能您找到了解决方案,但目前我制定了一个正在我的 Angular 应用程序中实施的身份验证方案。

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

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

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

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

谢谢

Angular.js 中的身份验证方案

于 2013-05-18T05:40:02.103 回答
18

三个月前我问过这个问题。

当我必须在基于 AngularJS 构建的 Web 应用程序中处理用户身份验证时,我想分享一下我最喜欢的方法。

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

您不能在 angularjs 中授权任何东西,因为用户可以完全控制执行环境(即浏览器)。

从您的 angularjs 应用程序的角度来看,“登录”或“注销”只是用户的 gui 提示。

因此,简要地说,我的方法包括:

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

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

2)使用服务来维护有关每个用户的数据及其身份验证状态。

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 进行用户身份验证”上写了关于这种方法的文章(更详细地) 。

于 2013-05-21T11:33:14.733 回答
4

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

只要有效的会话 ID 不容易被猜到,并且像将会话令牌与客户端的 IP 相关联这样的措施,这没什么大不了的。

理论上,您也可以加密 cookie,只要您在服务器端这样做。

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

于 2013-02-09T20:48:38.960 回答
0

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

用户登录需要存储在某个地方——99.9% 的时间是在服务器端数据库中。

理想情况下,对于真正安全的系统,您需要一个后端(服务器端)成员系统,该系统将会话存储在与包含加密密码的成员表相关的数据库表中,但还提供一个 RESTful 接口,您可以在其中构建您的 api 调用到。

我成功使用的一个脚本是 Amember https://www.amember.com/。尽管还有很多其他脚本,但这是一种非常经济有效的方式,我在这个方面取得了很大的成功。它也是 PHP,所以你可以为你的 Angular http 调用构建一个 API容易地。

所有这些 javascript 框架都很棒,但效果是现在太多人过于关注事物的前端——也要学习数据库/后端!:-)

于 2016-03-31T17:00:10.390 回答