前言:
最近折腾相关。
走了个流程,写了个快捷点的,定义个骨架那种,只完成了验证和签发,用了不到一天半时间。
https://github.com/fangker/n-jwtproxy
JWT无法避免重放攻击,每15-30分钟重新签发一次,jti可以解决上面问题,每次更新ID,token相比于session更能够胜任分布式…完全是扯淡。。每次更新ID还要用到redis,再者明文秘钥不安全,正确的姿势是每次根据用户名+某规则生成JTI然后存redis生成随机秘钥,每次用用户的随机秘钥来验证用户自己。。且jwt payload部分明文不能带有敏感信息。。这样来说还不如用session来的实在。。因为你不可能以这种方式来进行减压,会导致服务器客户端状态不同(而且并没有减少一次查核的操作-靠这东西来区分权限)。目前jwt在单点登录和移动设备上有的一玩(无法举出反例没接触)。
补充: 关于TOKEN防止CSRF攻击的情况,早上恶补了知识,答案是没有session你搞毛。CSRF 可以看下csrf这个模块 https://github.com/pillarjs/csrf/blob/master/index.js 采用的方式是uid+秘钥验证的方式,表单附加 随机token,代码很清晰 还是需要redis来存key。其实也可以对cookie进行签名用单一key的话,当然知识单纯对于跨站来说。
总结一句话:比较弱鸡。。。。
es6的代理:
代理使用示例 来自 http://www.oschina.net/translate/use-cases-for-es6-proxies
试用了几发,实用性一般,但是某些时候也有用处 反射那一块也挺有意思(恍恍惚惚在略拾)。
// Define a validator that takes custom validators and returns a proxy
function createValidator(target, validator) {
return new Proxy(target, {
_validator: validator,
set(target, key, value, proxy) {
if (target.hasOwnProperty(key)) {
let validator = this._validator[key];
if (!!validator(value)) {
return Reflect.set(target, key, value, proxy);
} else {
throw Error(`Cannot set ${key} to ${value}. Invalid.`);
}
} else {
// prevent setting a property that isn't explicitly defined in the validator
throw Error(`${key} is not a valid property`)
}
}
});
}
// Now, just define validators for each property
const personValidators = {
name(val) {
return typeof val === 'string';
},
age(val) {
return typeof age === 'number' && age > 18;
}
}
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
return createValidator(this, personValidators);
}
}
const bill = new Person('Bill', 25);
// all of these throw an error
bill.name = 0;
bill.age = 'Bill';
bill.age = 15;