当前位置: 首页 > 后端技术 > Node.js

一步步搭建一个react应用——使用jwt+redis进行基于token的用户认证

时间:2023-04-03 17:20:21 Node.js

【一步步搭建一个react应用-开始】(https://segmentfault.com/a/11...git地址基于token的认证过程客户端用户发送登录请求服务器验证用户名密码验证成功服务器生成一个token,token在client响应客户端后,在每个请求的header中包含token,服务端对需要认证的接口验证token,验证成功接收到请求,这里我们使用jsonwebtoken生成tokenjwt.sign(payload,secretOrPrivateKey,[options,callback])使用express-jwt验证token(验证成功则将token信息放入request.user)=>{if(req.headers.authorization&&req.headers.authorization.split('')[0]==='Bearer'){returnreq.headers.authorization.split('')[1];}elseif(req.query&&req.query.token){returnreq.query.token;}returnnull;}}为什么redis使用jsonwebtoken生成token时可以指定token的有效期,以及verify方法jsonwebtoken的也提供了更新token有效期的选项,但是这里使用了express_jwt中间件,express_jwt没有提供刷新token的方法思路:客户端请求登录成功,生成token并将token保存在redis中,并设置redis的有效期(比如1h)。当有新的请求过来时,express_jwt先校验token,校验成功,然后校验redis中是否存在token,如果在有效期内有客户端新的请求,提取token,更新有效期redis中的令牌,客户端注销请求,在redis中删除这个token='MOVIESKEY'consttoken={SECRET,sign:(user)=>{returnjwt.sign(user,SECRET)},getToken:functionfromHeaderOrQuerystring(req){if(req.headers.authorization&&req.headers.authorization.split('')[0]==='Bearer'){returnreq.标题。授权。分裂('')[1];}elseif(req.query&&req.query.token){returnreq.查询.token;}返回空值;},validToken:express_jwt({secret:SECRET,getToken:this.getToken}),noAuthorization:(err,req,res,next)=>{if(err.status==401){res.json(err)返回}next()},//token在redis中存在,更新有效期,如果不存在,说明你已经注销checkRedis:(req,res,next)=>{consttok=token.getToken(req)redis.get(tok,(data)=>{if(data){//token在redis中存在,延期时间redis.updateExpire(tok)next()}else{next(10005)}})},添加:(tok)=>{redis.add(tok)},移除:(req)=>{consttok=token.getToken(req)tok&&redis.remove(tok)}}token.checkRedis.unless=unlessmodule.exports=token使用routes/movies.jsconstunlessPath={path:[{url:'/api/movies',methods:['GET']},{url:'/api/电影/搜索/通过',方法:['GET']},{url:/movies\/[^\/]+$/,方法:['GET']},]}if(process.env.NODE_ENV!='test'){router.use(token.validToken.unless(unlessPath),token.noAuthorization,token.checkRedis.unless(unlessPath))}router.get('/',(req,res,next)=>{})router.post('/',(req,res,next)=>{})router.put('/:movieId',(req,res,next)=>{})