Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express.js和Angular-身份验证和登录会话_Javascript_Angularjs_Node.js_Express - Fatal编程技术网

Javascript Express.js和Angular-身份验证和登录会话

Javascript Express.js和Angular-身份验证和登录会话,javascript,angularjs,node.js,express,Javascript,Angularjs,Node.js,Express,我正在使用expressjs和angularjs作为应用程序。基本上,expressjs只返回一个有角度的单页应用程序的.html。所有路由都是通过angularjs完成的,而expressjs只公开了一些web服务(GET、POST) 所以,如果我只做一个常规的expressjs应用程序,我会使用passportjs并将用户存储在服务器端的会话中。当用户试图访问/admin页面时,我会使用passport中间件来检查路由是否被允许等等。简单明了 但使用angular,所有路由都是在客户端完成的

我正在使用expressjs和angularjs作为应用程序。基本上,expressjs只返回一个有角度的单页应用程序的.html。所有路由都是通过angularjs完成的,而expressjs只公开了一些web服务(GET、POST)

所以,如果我只做一个常规的expressjs应用程序,我会使用passportjs并将用户存储在服务器端的会话中。当用户试图访问/admin页面时,我会使用passport中间件来检查路由是否被允许等等。简单明了

但使用angular,所有路由都是在客户端完成的,即使评估用户是否登录。当然,现在已经有很多关于这方面的文章,但是几乎所有的解决方案都在
localStorage
或angular的
$cookie
中存储任何类型的令牌密钥。现在我在想,这样安全吗

如果有人在公共计算机上运行这样的应用程序,而忘记注销,那么任何人都可以查看
localStorage
或angular的
$cookie
并获取令牌,对吗


那么,使用angularjs在客户端实现安全身份验证的理论过程是什么呢?

我通过创建一个名为MyAuthentication的Angular服务来实现这一点,该服务提供了这些方法

  • 认证(un,pwd)
  • 注销()
为了得到适当的分离,我有一个单独的用户代理,它可以发出我的用户HTTP请求

angular.module('myNgApplication').service('MyAuthentication', function ($rootScope, $cookies, $log, UserProxy) {

    var self = this;
    self.user = null ;

    (function(){
        UserProxy.retrieveSession().then(function(authResponse){
            self.user = authResponse
        }, function() {
            self.user = null
        })
    }).call(this)

    this.isLoggedIn = function() {
        return self.user != null ;
    }

    this.login = function (email, password) {
        return UserProxy.login(email, password).then(function(authResponse){
            self.user = authResponse
            return self.user
        })
    }

    this.logout = function () {
        return UserProxy.logout().then(function(response){
            self.user = null ;
            return response
        })
    }

    // this is never used externally. because the HTTP request to gte the user may be in progress when this is called and therefore self.user is null
    this.getUser = function()  {
        return self.user
    }

    this.bootstrapUser = function(callback){
        if(self.isLoggedIn()){
            callback(self.user)
        }
        else {
            $rootScope.$watch(self.getUser, function(newUser, oldUser) {
                if(newUser != oldUser) {
                    callback(self.user)
                }
            });
        }

    }

})
用户对象始终保留在内存中。。。那么权利可以是这样的:

angular.module('myNgApplication').service('MyEntitlments', function (MyAuthentication) {



   this.isEntitled = function(feature)  {

        return MyAuthentication.bootstrapUser(function(user){
            // check users role and feature            
            return true || false
        })

    }

})
在服务器上,我仍在使用Passport。

引用:

所以,如果我只做一个常规的expressjs应用程序,我会使用passportjs并将用户存储在服务器端的会话中

会话数据存储在服务器上时,会话标识符存储在客户机上的cookie中。如果cookie被盗(例如在公共计算机示例中),则会话可以被其他人使用。客户端应用程序可以使用cookie会话标识符方案。当Angular向服务器发出XHR请求时,它将提供cookie

正如您所看到的,JSON Web令牌(JWT)已经作为一种新方案出现。它们替换会话标识符,但不替换cookie。您可能会看到正在使用本地存储,但这并不安全。如果您设置
HttpOnly,Cookies实际上是存储身份验证令牌的最安全的地方;安全
标志。这将防止JS环境读取cookie,并防止浏览器通过非安全通道将cookie发送到服务器

我在以下两篇文章中详细介绍了JWTs和Angular应用程序:


如果您担心公共计算机,则必须避免完全存储令牌。这意味着将令牌保留在javascript内存中,并通过HTTP头提供它(通常是
Authorization:Bearer,我们有一个用户管理服务,可以非常轻松地将身份验证添加到您的Angular应用程序中。您可以在我们的ok中了解它,所以它不会存储在cookie或localstorage中?但如果用户关闭浏览器,然后返回页面,会发生什么情况?他必须再次登录,对吗,是的。你不能两全其美。你可以做的另一件事是添加一个cookie来标识服务器上的会话。用户cookie中唯一的东西是会话id。MyAuthentication服务中的自调用函数尝试检索会话…因此你可以在那里做些工作。事实上,你要么需要o存储本地内容,或者如果他们关闭浏览器,则要求他们重新登录。如果您存储本地内容,则最好尽可能少地存储。我仍然觉得我对您的解决方案了解不够;例如,您如何在angularjs中将
/#/admin/user/1
设置为私有?即使您设置了
routeChangeStart
run
中,任何人都可以在客户端编辑.js文件并删除限制。甚至可以仅在角度视图中完全保护视图吗?我明白了,我认为您更多的是指cookie方面-然后您希望将身份验证添加到路由更改事件中。