好,做更多的研究后,这里是我想出了最安全的身份验证可能的解决方案:
首先,你必须设置并获得服务器端只(在这种情况下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/