2016-02-26 101 views
1

我最近一直在寻找如何使用JWT进行认证和重构我的应用程序以使用它们而不是会话,当我们涉及到将移动应用程序与服务器端的api集成时。安全地使用Json Web令牌

由于我正在构建fintech产品,所以安全性非常重要。

我正在使用sails js以及护照-jwt。我使用AngularJS $ cookies.put函数将令牌存储在浏览器cookie中。我的目标是尽可能确保该令牌不会被任何浏览器中的第三方劫持或使用,以向授权用户以外的服务器发送请求。

为了保护这个令牌我才知道,我要这个cookie存储与的HttpOnly标志,以使其从JavaScript不可访问,这意味着我将无法执行Ajax请求时访问此令牌在客户端,我将需要在passport-jwt的请求头中连接令牌,以便能够使用来自服务器端的AuthHeader()函数的进行提取。

要做的另一件事是将的安全标记的cookie设置为true,以强制它仅通过SSL传输。

我的问题是:

  1. 我在正确的轨道,以确保使用JWT最安全的?
  2. 如果是,如何在角度$ cookies.put方法中设置cookie标志?
  3. 如果我不能从客户端访问cookie,012xx我怎么让passport-jwt从服务器端访问它来验证?
  4. 如果我将标记放在标题中,我可以使用 角度$ http拦截器在ajax请求中执行此操作,那么对于需要身份验证的普通浏览器查看请求,该怎么做 ?
  5. 使用sails CSRF保护,它会解决我的问题吗?

谢谢。

链接我在我的研究中使用: https://stormpath.com/blog/the-ultimate-guide-to-mobile-api-security/ https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/

回答

0

好,做更多的研究后,这里是我想出了最安全的身份验证可能的解决方案:

首先,你必须设置并获得服务器端只(在这种情况下sailsJS)饼干,这就是为什么我们设置的HttpOnly标志是真实的:

res.cookie('cookieName', jwt, { 
    secure: req.connection.encrypted ? true : false, 
    httpOnly: true 
}); 

请注意,我检查,如果当前连接被安全设置为安全标志,以便能够在本地主机上以开发模式进行测试。

二,护照,智威汤逊,以便能够从cookie的访问令牌,以验证它,你将不得不实现自定义提取器在其仓库中提到:

如果提供的提取唐不符合您的需求,您可以轻松地提供您自己的回拨 。例如,如果您使用的是 cookie的解析器中间件和要提取JWT你 可以使用下面的函数作为参数传递给jwtFromRequest 选择一个cookie:

function cookieExtractor(req) { 
    var token = null; 
    if (req && req.cookies) 
    { 
     token = req.cookies.tokenName; 
    } 
    return token; 
}; 

passport.use(
    new JwtStrategy({ 
     jwtFromRequest: cookieExtractor, 
     secretOrKey: sails.config.jwtSettings.secret, 
     issuer: sails.config.jwtSettings.issuer, 
     audience: sails.config.jwtSettings.audience, 
     passReqToCallback: false 
    }, 
    function (payload, next) { 
     var user = payload.user; 
     return next(null, user, {}); 
    })); 

最后但并非至少,如果您打算使用cookie,则需要实施CSRF安全性,这里是您要使用拦截器的地方。首先,你需要告诉你会在配置/ csrf.js使用CSRF令牌风帆项目:

module.exports.csrf = true; 

这时你可以用一个非常漂亮的包在这里,这将是拦截您的AJAX请求和发送CSRF令牌与他们一起 https://github.com/aditzel/spring-security-csrf-token-interceptor。但是,这需要一点点的调整与帆来运作:在弹簧安全CSRF令牌,interceptor.js文件搜索此行

this.token = xhr.getResponseHeader(this.settings.csrfTokenHeader); 

并与这两条线替换:

var jsonResponse = JSON.parse(xhr.responseText); 
        this.token = jsonResponse._csrf; 

这是你将如何配置包带帆的功能:

angapp.config(function(csrfProvider) { 
    // optional configurations 
    csrfProvider.config({ 
     url: '/csrfToken', 
     csrfHttpType: 'get', 
     httpTypes: ['HEAD', 'PUT', 'POST', 'DELETE'] //CSRF token will be added only to these method types 
    }); 
}); 

注意:对传统观点的形式读取CON评论fig/csrf.js文件。

还有一件事,因为您使用的是无状态的jwt认证,您将需要存储两个cookie:一个用于身份验证并保存用户ID,如上所述,另一个用于存储用于查看的用户信息前端和从后端更新

updateUserInfoCookie: function (res, user) { 
     res.cookie('user', user.toJSON(), { secure: res.connection.encrypted ? true : false, maxAge: sails.config.jwtSettings.expiresIn * 1000, signed: true, httpOnly: true }); 
    }, 
    getCurrUserInfo: function(req){ 
     return req.signedCookies.user; 
    } 

希望这是明确的,可以帮助某人。

Resources:https://stormpath.com/blog/build-secure-user-interfaces-using-jwts/