我希望通过将所有cookie移动到本地存储来减少我的网站上的加载时间,因为它们似乎具有相同的功能.除了明显的兼容性问题之外,使用本地存储替换cookie功能是否有任何优点/缺点(特别是在性能方面)?
我正在与AngularJS建立一个与服务(JAVA)通信的SPA.
当用户发送他的用户名/密码时,服务会发回两个:访问令牌和刷新令牌.我正在尝试处理:如果我得到状态401的响应,则发送回刷新令牌,然后再次发送您的最后一个请求.我尝试使用包含$ http来做到这一点,但angular不允许我将它包含在这个拦截器中.有没有办法用我收到的响应参数重新创建原始请求?
就像是:
在错误重定向到/登录页面
'use strict';
angular.module('testApp')
.factory('authentificationFactory', function($rootScope, $q, $window, $location, CONF) {
return {
request: function(config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
console.log(config);
$rootScope.lastRequest = config;
return config;
},
response: function(response) {
console.log($rootScope.lastRequest);
if (response.status === 401) {
if ($window.sessionStorage.refreshToken) {
//Save, request new token, send old response
//if it fails, go to login
$location.url('/login');
} else {
$location.url('/login');
}
}
return response …Run Code Online (Sandbox Code Playgroud)javascript authentication http-status-code-401 access-token angularjs
我正在寻找一种以安全的方式验证我的移动应用程序用户的方法.移动应用程序是一个纯JS应用程序,并使用离子框架(和所以cordova).该应用程序只能通过REST API与我们的服务器通信.要求如下:
我发现了什么:
OAuth 2提供称为"刷新令牌"的长时间令牌.我想使用它的过期日期设置为一年.
然而,似乎没有强大的机制来保护这个标记.事实上,正如Jamsheed Kamarudeen对该答案的评论/sf/answers/504648441/所述,如果刷新令牌,客户端ID和秘密ID被盗(使用嗅探或直接从设备获取),攻击者将能够无限制地访问用户帐户......没有任何办法,AFAIK,知道它正在发生.
嗅探可能很困难,因为很明显,所有数据都将通过安全连接(SSL)发送,但从我的角度来看,它仍然可以进行管理.关于第二种攻击,"直接从设备中取出",我看到的每个解决方案都是关于在本地存储或浏览器cookie上存储数据(令牌或cookie)(例如,这篇文章在HTML5 Web App中使用OAuth2) .即使该帖子中的示例建议存储刷新令牌的哈希,我也看不出它的目的是什么,因为正如Mati Cicero的评论所提到的,它不会阻止攻击者能够检索到访问令牌,在我的情况下,可以无限制地访问用户的帐户.
此外,从我所看到的,本地存储和cookie太容易阅读.这还不够,还是我应该使用Android/iOS的原生安全存储?甚至本地本地存储似乎还不够(https://github.com/phonegap/phonegap/wiki/Platform-Security).
服务器端将由Spring实现.Spring-security提供的机制似乎比关于记忆我模式的OAuth 2更好(http://jaspan.com/improved_persistent_login_cookie_best_practice).但是,正如我所理解的那样,最终用户将无法在应用程序上登录两次(比方说,它的个人移动设备和专业移动设备).我承认这不是一个大问题,但它仍然不完美.最重要的是,最后,我们仍然存在有关cookie /令牌的存储安全问题.
这是我第一次寻找安全机制,所以也许我误解了一些机会主义,请让我知道.但是,我很惊讶地发现找到合适的流程有多困难.我确信这是所有移动应用程序的经典问题,但我找不到任何正确的方法来管理这个问题.
我的问题:正如您在上面所看到的,我没有找到一个安全的机制来在Web移动应用程序上设置"自动登录"过程.我该怎么设置?你有其他机械主义,而不是我发现的那些吗?
我在AngularJS SPA中使用资源所有者密码凭据OAuth 2.0流程.有几篇文章(这里,这里 ......)和这个问题的答案解释了我们不应该在(web)客户端(LocalStorage)上存储刷新令牌,而是将它们加密存储在HttpOnly Cookie中并使用代理API我们实现refreh令牌的解密,将其转发给安全令牌服务.
大多数文章都暗示我们应该通过使用一种常见的保护机制来关注CSRF.我想知道单页应用程序中最好的解决方案是什么.
Angular $ http参考解释了我们应该如何对抗CSRF的默认机制:服务器必须设置一个名为的cookie XSRF-TOKEN.此cookie必须是Javascript可读的,以便我们可以X-XSRF-TOKEN在请求中设置HTTP标头.这种机制是否足以保护refreh令牌场景?
第一次启动应用程序.没有访问令牌或cookie可用,我们必须使用用户名和密码登录.api/login给我们一个访问令牌,我们保留在内存中并设置两个cookie.HttpOnly refreh令牌cookie和JS可读XSRF-TOKENcookie.
访问令牌到期.调用api/token验证XSRF-TOKEN并使用令牌cookie返回新的访问令牌; 设置新的刷新cookie
从中重启应用程序AppCache.内存中没有访问令牌,但可用cookie.用api/token...
坏人想偷我们的refreh cookie.准备好的页面api/token使用我们的cookie 发出请求,但没有X-XSRF-TOKENHTTP标头.
任何严重的安全问题?
我们有一个用ASP.NET MVC编写的应用程序,它包含Web(非休息,使用razor)和API项目(以及其他一些项目,但现在除此之外).
Web中的身份验证使用基本表单身份验证完成,API中的身份验证使用OAuth2完成.
事实证明,在同一个应用程序中使用两种身份验证方法有点难以维护,因此我们决定放弃表单身份验证并对Web和API项目使用OAuth2.
在Web项目中,我们可能必须在cookie中存储OAuth2令牌,而不是将它们作为标头发送.是否可以使用OAuth2来保护"非休息"应用程序?如果是这样,这样做会有一些安全问题吗?
angularjs ×2
javascript ×2
oauth-2.0 ×2
security ×2
access-token ×1
asp.net ×1
asp.net-mvc ×1
cookies ×1
cordova ×1
csrf ×1
html ×1
httprequest ×1
oauth ×1
rest ×1