我正在使用angularjs实现Web API。我可以毫不费力地运行它并得到我想要的唯一的东西,我能够看到我的" access_token"在" Reponse"我"网络"的标签标签。虽然它是加密的,但我能够看到它。我的问题是: 这样安全吗? 2.如果这不是一个好习惯,我该如何隐藏它? 3.当我复制这个" access_token"并把它放在" Postman"应用程序,我实际上可以通过身份验证。我该怎么做才能避免这种情况?
从服务器获取令牌
myApp.factory('accountService', [
'$http', '$q', 'serviceBasePath', 'userService', function($http, $q, serviceBasePath, userService) {
var fac = {};
fac.login = function(user) {
var obj = { 'username': user.username, 'password': user.password, 'grant_type': 'password' };
Object.toparams = function ObjectsToParams(obj) {
var p = [];
for (var key in obj) {
p.push(key + '=' + encodeURIComponent(obj[key]));
}
return p.join('&');
}
var defer = $q.defer();
$http({
method: 'post',
url: serviceBasePath + "/token",
data: Object.toparams(obj),
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
}).then(function(response) {
userService.SetCurrentUser(response.data);
defer.resolve(response.data);
}, function(error) {
defer.reject(error.data);
});
return defer.promise;
}
fac.logout = function() {
userService.CurrentUser = null;
userService.SetCurrentUser(userService.CurrentUser);
}
return fac;
}
]);
设置并获取令牌
myApp.factory('userService', function () {
var fac = {};
fac.CurrentUser = null;
fac.SetCurrentUser = function (user) {
fac.CurrentUser = user;
sessionStorage.user = angular.toJson(user);
}
fac.GetCurrentUser = function () {
fac.CurrentUser = angular.fromJson(sessionStorage.user);
return fac.CurrentUser;
}
return fac;
});
谢谢。
答案 0 :(得分:1)
没有办法避免这种情况。同样,您可以在任何网站上获取您的身份验证cookie,并使用Postman作为您的用户拨打该网站。
如果您将令牌发送到浏览器,则用户可以获取它。
如果用户有权执行他们尝试执行的操作,则需要确保检查服务器端。然后,无论用户是否接受令牌并手动拨打电话都无关紧要,因为他们可以做的唯一事情就是他们通常可以通过应用程序正常完成的事情。
答案 1 :(得分:1)
为安全起见,请执行以下操作:
确保访问令牌cookie是一个安全的cookie。
确保访问令牌cookie是仅限HTTPS的cookie。
请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Secure_and_HttpOnly_cookies
此外,您的服务器概要有一个密钥来解码cookie。确保你把它保密(不要把它放在公共仓库上)。
确保您了解授权(如果未授权则为401)和身份验证(如果未经过身份验证,则为403)之间的区别。这里的基本区别是授权失败不会让你进入。而身份验证只会让某些用户访问某些服务器端点。
e.g。 group1中的用户可能能够获取数据但不能POST新数据。如果他们试图POST,他们会得到403。 group2中的用户可以发布内容。