在做登录界面时,有很多关于安全验证的方法,比如:
1、可以使用Session来实现安全验证
2、对请求的接口的参数进行加密的签名验证
3、使用JWT实现接口的验证
基于Session的安全验证
Session存储在服务器中,用户较少的话可以使用该类简单的安全验证机制,但是涉及到跨域就需要进行一些配置,用户量大的话存在一定情况的风险。对请求参数进行加密的签名验证
该方法的优点在于:1、url参数防篡改 2、sign 防重放 3、身份是否合法
前端通过设置不同的规则,将传递的参数进行处理:
1、对参数按照key=value的格式,并按照参数名ASCII字典序排序:
2、拼接API密钥生成Sign:
3、发送新的数据使用JWT实现接口的验证
JWT是目前主流的跨域身份验证的解决方法,也是常用的一种安全验证机制。
nodejs中使用JWT实现接口的安全验证:
1、安装jsonwebtoken
cnpm install jsonwebtoken --save
2、生成token
var jwt = require('jsonwebtoken');
router.get('/',function(req,res,next){
var token = jwt.sign({name:'admin'},'sign',{
expiresIn: 60
});
res.send(token);
})
3、安装basic-auth
cnpm install basic-auth --save
4、获取请求头里面的token
router.get('/addressList',function(req,res,next){
var token = auth(req);
})
router.get('/addressList', function (req, res, next) {
var tooken = auth(req);
if (tooken) {
try {
var power= jwt.verify(token.name, 'sign');
console.log( power);
if ( power) {
res.send('有权限');
} else {
res.send('没有权限');
}
} catch (error) {
res.send(error);
}
}else{
res.send('没有权限');
}
});
5、Vue React Angular 使用 Axios 访问基于 Jwt 的接口
axios.get("http://localhost:3000/api/list", {
auth: {
username:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoi5byg5LiJIiwiaWF0IjoxNTcxMTIwNTE3LCJleHAiOjE1NzExMjIzMTd9.Kcbvg7AGqZlmVyUb8CKyO3fqf-zEwqIWEN2nsUSl17Q",
password: "123456"
}
}).then(function(response) {
// handle success
console.log(response);
}).catch(function(error) {
// handle error
console.log(error);
}).finally(function() {
// always executed
})
- JWT的优点:
由于服务器不保存 session 状态,因此无法在使用过程中更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效。JWT 不仅可以用于认证,也可以用于交换信息。使用 JWT可以降低服务器查询数据库的次数。