您现在的位置是:首页 > 后台文章 > NodeNode

node生成token和验证token

譬如朝露2019-04-19Node2606人已围观

简介Node生成token验证用户的身份,使用jsonwebtoken这个插件使用方法:var jwt = require('jsonwebtoken');生成token主要用到的方法是...

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
        })
});

生成结果


image.png

解析验证方法: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
	})
})

解析结果:

image.png

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');
});


譬如朝露
  • 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《譬如朝露》。
  • 本文网址:http://www.pangbo51.com/node/167.html
  • 上篇文章:Node生成token插件
  • 下篇文章:mongoose定义结构
  • node

文章评论

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~

站长特荐

关闭
QQ 微信 支付宝扫一扫打赏