Node生成token验证用户的身份,使用jsonwebtoken这个插件
使用方法:
var jwt = require('jsonwebtoken');
生成token主要用到的方法是 jwt.sign()
签名方法:jwt.sign(payload, secretOrPrivateKey, [options, callback])
payload 是一个json对象或者是一个可以json化的buffer或字符串 这个对象可以存储用户id,会话信息等,这里的信息都是可以使用jwt.verify()方法拿到的. secretOrPrivateKey是加密的key或者叫做密匙,不知道密匙是无法解析payload参数的. options 参数 是一个json对象 expiresIn : 表示有效期 不带单位默认为秒 如带单位如: "2 days", "10h", "7d"
如生成一个token,把用户id,name,avatar,istatus,email等信息放进去,设置有效期为1小时,Bearer相当于解析token的钥匙,最好不要一起返回给前端
let rule={id:user.id,name:user.name,avatar:user.avatar,istatus:user.istatus,email:user.email} jwt.sign(rule, 'Bearer ',{ expiresIn: 3600 }, function(err, token) { if(err) throw err; res.json({ status:0, msg:'Bearer '+token }) });
生成结果
解析验证方法:jwt.verify(token, secretOrPublicKey, [options, callback])
token: 就是token字符串 由jwt.sign()方法生成的
secretOrPublicKey:是加密的key,用于解析生成token时的payload参数
jwt.verify(token, 'Bearer ', function (err, data) { if (err) console.log(err) console.log('解析的数据', data) })
这里不知道为什么回调没有用,有大佬知道的可以留言一下,我这里使用的是直接赋值给变量
router.get('/current',function(req, res, next) { let token=req.get("Authorization"); let tok=jwt.verify(token, 'Bearer') console.log(tok) res.json({ id:tok.id, name:tok.name, email:tok.email, avatar:tok.avatar, istatus:tok.istatus }) })
解析结果:
token的验证,需要使用express-jwt
express-jwt是nodejs的一个中间件,他来验证指定http请求的JsonWebTokens的有效性,如果有效就将JsonWebTokens的值设置到req.user里面,然后路由到相应的router。 此模块允许您使用Node.js应用程序中的JWT令牌来验证HTTP请求。 JWT通常用于保护API端点。
express-jwt和jsonwebtoken是什么关系
express-jwt内部引用了jsonwebtoken,对其封装使用。 在实际的项目中这两个都需要引用,他们两个的定位不一样。jsonwebtoken是用来生成token给客户端的,express-jwt是用来验证token的。
安装
npm install express-jwt
设置需要保护的API
在app.js中写入
var expressJWT=require('express-jwt');
app.use(expressJWT({ secret: 'Bearer '}).unless({ path: ['/users/login','/users/login','/users/current'] }));
path中的路径是不需要验证token的api接口
示例代码,例如我需要使用info/add这个接口,如何验证token那?
router.get('/add', function(req, res, next) { const inf={} console.log(req.user.name) if(!req.user.name){ return res.json({ status:1, msg:'token失效' }) }else{ if(req.body.name) inf.name=req.body.name if(req.body.zhiwei) inf.zhiwei=req.body.zhiwei if(req.body.company) inf.company=req.body.company if(req.body.depar) inf.depar=req.body.depar var infoAdd=new Info(inf); infoAdd.save().then(doc=>{ res.json({ status:0, result:inf }) }) } })
之前就已经提到过http请求的JsonWebTokens的有效性,如果有效就将JsonWebTokens的值设置到req.user里面,所以我们直接判断req.user.name是否存在,如果存在则证明token解析正确,否则就是解析错误
以上的是全局expressJWT,如果你需要在某个接口单独使用:
router.get('/add',expressJWT({secret: 'Bearer '}), function(req, res, next) { const inf={} console.log(req.user.name) if(!req.user.name){ return res.json({ status:1, msg:'token失效' }) }else{ if(req.body.name) inf.name=req.body.name if(req.body.zhiwei) inf.zhiwei=req.body.zhiwei if(req.body.company) inf.company=req.body.company if(req.body.depar) inf.depar=req.body.depar var infoAdd=new Info(inf); infoAdd.save().then(doc=>{ res.json({ status:0, result:inf }) }) } })
校验token失败时的处理
在app.js中写入
// error handler app.use(function(err, req, res, next) { // set locals, only providing error in development //这里是对token效验错误处理 if (err.name === 'UnauthorizedError') { res.status(401).json({ msg:'token效验错误' }) } res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); });
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接