基于token的认证机制—JWT介绍简单来说就是用户调用登录接口后,服务端返回一个token,前端拿到令牌并将其放在标题中。每次请求都会传给服务器,服务器根据token进行校验。有效则继续,无效则立即返回。使用jsonwebtoken生成token使用express-jwt验证token是否无效使用jsonwebtoken解析出token中的用户信息,比如id安装依赖npminstalljsonwebtoken--savenpminstallexpress-jwt添加server/node_api/src/libs/token.js文件importjwtfrom'jsonwebtoken'importconfigfrom'../config'constjwtSecret=process.env.NODE_ENV==='production'?config.tokenKey.prod:config.tokenKey.devexportconstgenerateToken=(userName,userId)=>{returnnewPromise((resolve,reject)=>{consttoken=jwt.sign({userName,userId},jwtSecret,{expiresIn:'24h'});resolve(token)})}exportconstgetToken=(token)=>{returnnewPromise((resolve,reject)=>{if(!token){reject({error:'令牌是空的'})}else{console.log('token=',token)constinfo=jwt.verify(token.split('')[1],jwtSecret)console.log('info=',info)resolve(info)//解析返回值}})}jwt.sign()传入需要解析的值,一般是userName、userId、expiresIn,用来设置token的过期时间。打印内容如下:token=bearereyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyTmFtZSI6ImFkbWluIiwidXNlcklkIjoxLCJpYXQiOjE2MDk3NDExNDEsImV4cCI6MTYwOTgyNzU0MX0.JsioftQnZxM5xkfTkAiUjmzW29XGbkx2_H69-xe-iYsinfo={userName:'admin',userId:1,iat:1609741141,exp:1609827541}在app.js中增加一个中间件验证token是否过期。app.use((req,res,next)=>{consttoken=req.headers['authorization']if(token==undefined){next()}else{getToken(token).then((data)=>{res.data=data;next()}).catch((error)=>{next()})}})app.use(expressJwt({secret:'Baohong123456',algorithms:['HS256']}).unless({path:['/users/login']}))app.use('/',indexRouter)app.use('/users',usersRouter)...//错误处理中间件app.use(function(err,req,res,next){//设置局部变量,仅在开发中提供错误res.locals.message=err.messageres.locals.error=req.app.get('env')==='development'?err:{}//渲染错误页面res.status(err.status||500)if(err.status===401){res.status(401).send('tokeninvalid')}res.render('error')})编辑server/node_api/src/routes/users.js,当用户登录成功后,生成token返回给用户。因为node没有直接查询数据库,而是调用了java提供的登录接口,如果正常返回,则判断登录成功router.post('/login',(req,res,next)=>{login({user_name:'admin',user_pwd:'666'}).then(result=>{const{result:{data:{data:{user,token}}}}={result}generateToken(user.userName,user.id).then(nodeToken=>{res.send({token,user,nodeToken})})})})前端获取成功调用登录接口后返回的token,可以保存到localStorage,并且每次发送请求时都会使用token,只要把它放在请求头中即可。src/libs/axios.jsconsttoken=localStorage.getItem('token')if(token){config.headers.authorization='Bearer'+token}参考node.js中express的token验证
