Javascript Express.js和Angular-身份验证和登录会话
我正在使用expressjs和angularjs作为应用程序。基本上,expressjs只返回一个有角度的单页应用程序的.html。所有路由都是通过angularjs完成的,而expressjs只公开了一些web服务(GET、POST) 所以,如果我只做一个常规的expressjs应用程序,我会使用passportjs并将用户存储在服务器端的会话中。当用户试图访问/admin页面时,我会使用passport中间件来检查路由是否被允许等等。简单明了 但使用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,所有路由都是在客户端完成的
localStorage
或angular的$cookie
中存储任何类型的令牌密钥。现在我在想,这样安全吗
如果有人在公共计算机上运行这样的应用程序,而忘记注销,那么任何人都可以查看localStorage
或angular的$cookie
并获取令牌,对吗
那么,使用angularjs在客户端实现安全身份验证的理论过程是什么呢?我通过创建一个名为MyAuthentication的Angular服务来实现这一点,该服务提供了这些方法
- 认证(un,pwd)
- 注销()
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方面-然后您希望将身份验证添加到路由更改事件中。