JWT与会话怎么在Nodejs中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>使用JWT 强>
JWT是JsonWebTokens的简写形式,具体是啥我就不详细写了,可以查看资料。
这里引入两个插件,express-jwt和JsonWebTokens, - - - - - -
- <李>
JsonWebTokens:用作生成标记
李> <李>express-jwt:用作验证指定http请求的JsonWebTokens的有效性,如果有效就将JsonWebTokens的值设置到点播。用户里面,然后路由到相应的路由器
李> express-jwt内部引用了jsonwebtoken,对其封装使用。使用JWT形式进行认证与授权的思路如下。
//安装 npm 小姐:jsonwebtoken ——保存 npm 小姐:express-jwt ——保存//引入 const jwt=,要求(& # 39;jsonwebtoken& # 39;); const expressJwt =,要求(& # 39;express-jwt& # 39;);//定义签名 const secret =, & # 39;盐# 39;;//生成令牌 const token =, jwt.sign ({ ,,名字:123 },,秘密,,{ ,,expiresIn: 60,//秒到期时间 });//生成的令牌//eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoxMjMsImlhdCI6MTQ5MTQ3NTQyNCwiZXhwIjoxNDkxNDc1NDg0fQ.hYNC4qFAyhZClmPaLixfN137d41R2CFk1xPlfLK10JU//使用中间件验证牌合法性 app.use (expressJwt ({ ,,秘密:secret })。如果({ ,,路径:[& # 39;/登录# 39;,,& # 39;/getUserInfo& # 39;],//除了这些地址,其他的URL都需要验证 }));//拦截器 app.use (function (呃,,要求的事情,,,,下一个),{//当令牌才能验证失败时会抛出如下错误 if 才能;(err.name ===, & # 39; UnauthorizedError& # 39;), {,, ,,,//这个需要根据自己的业务逻辑来处理(,具体的错误值,请看下面) ,,,res.status (401) .send (& # 39; invalid 令牌……& # 39;); ,,} });//定义一个接口,返回令牌给客户端 app.get (& # 39;/getUserInfo& # 39;,,函数(点播,res), { res.json({才能 ,,,令牌:令牌 })才能 })
客户端中使用令牌的正确形式应该是把牌放在授权这个标题里,对应的值以<代码>无记名代码>开头然后空一格
授权:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiQmluTWFpbmciLCJkYXRhIjoiPT09PT09PT09PT09PSIsImlhdCI6MTUwMTgxNDE4OCwiZXhwIjoxNTAxODE0MjQ4fQ.GoxGlc6E02W5VvqDNawaOrj3MPO-4UYeFdngKR4bVTE//采用axios可以这么写 const instance =, axios.create (); const yourToken =, & # 39; sfsgagfdgd& # 39;;//设置请求拦截器 instance.interceptors.request.use(函数(配置),{ config.headers.authorization =,才能“Bearer $ {yourToken}”, return 才能;配置; })
<强>使用会话强>
传统的认证和用户识别分别采用如下形式
- <李>
服务端:创建一个会话对象保存用户登录信息和状态,该对象有唯一ID,并返回一个饼干给客户端
李> <李>客户端:请求api时发送http头部自动带上饼干
李>这里使用饼干的方式需要引入两个插件:
- <李>
express-session:节点端的会话中间件,主要用作配置会话的属性并生成
李> <李>cookie-parser:节点端解析饼干对象
李>使用思路和智威汤逊差不多,这里主要的区别在于客户端请求资源时不用手动在http请求的头添加标识,浏览器会自动加上饼干,具体使用方式如下
var express =,要求(& # 39;表达# 39;); var cookieParser =,要求(& # 39;cookie-parser& # 39;); var session =,要求(& # 39;express-session& # 39;); , app.use (cookieParser (& # 39; sessiontest # 39;)); app.use(会话({ ,,秘密:& # 39;sessiontest # 39;//与cookieParser中的一致 :,,重新保存,真的,,,//(是否允许)当客户端并行发送多个请求时,其中一个请求在另一个请求结束时对会话进行修改覆盖并保存。 滚动才能:,真的,,,//强制在每个响应中重设饼干的过期时间,并重新开始计时 saveUninitialized才能:真的,,,//初始化会话时是否保存到存储。默认为真的,,但是(后续版本)有可能默认失效,所以最好手动添加。 ,,饼干:{ ,,,maxAge:, 60, *, 1000,//过期时间,单位毫秒 ,,} }));/* * ,*资源请求拦截器 ,*用户端若登录状态过期或未登录则自动抛出错误 ,*/app.use(功能(要求的事情,,,,下一个),{ let 才能;url =, req.originalUrl; req.session.touch才能();,//刷过新会话期时间 if 才能;(url !==, & # 39;/登录# 39;,,,,! req.session.user), { ,,,res.status (401) .send(& # 39;登录状态已过期& # 39;); ,才能返回 ,,} 下才能(); })JWT与会话怎么在Nodejs中使用