在做登录界面时,有很多关于安全验证的方法,比如:
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
varjwt=require('jsonwebtoken');router.get('/',function(req,res,next){vartoken=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){vartoken=auth(req);})
router.get('/addressList',function(req,res,next){vartooken=auth(req);if(tooken){try{varpower=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 successconsole.log(response);}).catch(function(error){// handle errorconsole.log(error);}).finally(function(){// always executed})
JWT的优点:
由于服务器不保存 session 状态,因此无法在使用过程中更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效。JWT 不仅可以用于认证,也可以用于交换信息。使用 JWT可以降低服务器查询数据库的次数。
https://www.jianshu.com/p/e2fe821262cb