接着上遍文章(使用会话保存用户数据)来让使用jwt保存用户数据。
这里会用到passport-jwt/jsonwebtoken。
passport-jwt是护照的一个验证策略。它使用智威汤逊(json web标记)验证。
jsonwebtoken是一个编码,解码,验证jwt的模块。
会话 json web标记 保存在服务器 保存在的客户
因会话保存在服务器,所以服务器压力比较大。听说并发量达到1 k时就能看到效果。
因jwt保存在的客户,所以需要加密。
1。安装依赖。
npm我passport-jwt jsonwebtoken
2。创建一个配置文件,引用配置是使用。
//,/config.js 模块。出口={ secretKey:“12345-67890-9876-54321”, mongoUrl:“mongodb://localhost: 27017/困惑 }
3。使用数据库链接配置
var配置=要求(。/配置) … const url=config.mongoUrl const概念网络=猫鼬。连接(url, {useNewUrlParse:真的,useCreateIndex:真})
4。创建验证文件
。/authenticate.js var=需要护照(护照), LocalStrategy=需要.Strategy (“passport-local”), 用户=要求(“。/模型/用户”) var JwtStrategy=需要.Strategy (“passport-jwt”), ExtractJwt=需要.ExtractJwt (“passport-jwt”), jwt=要求(“jsonwebtoken”) var配置=要求(“。/config.js”) 护照。使用(新LocalStrategy (User.authenticate ())) passport.serializeUser (User.serializeUser ()) passport.deserializeUser (User.deserializeUser ()) 出口。getToken=function(用户){ jwt返回。号(用户、配置。secretKey, {expiresIn: 3600})//签发牌时设置超时时间是3600年代 } var选择={} 选择。jwtFromRequest=ExtractJwt.fromAuthHeaderAsBearerToken()//从验证头中提取,模型默认不记名的“是”。 选择。secretOrKey=config.secretKey 出口。jwtPassport=护照。使用(新JwtStrategy(选择(jwt_payload)=比;{ 控制台。日志(JWT载荷:,jwt_payload) 用户。findOne ({_id: jwt_payload。_id},(呃,用户)=比;{ 如果(err) { 返回了(呃,假) 其他}{ 如果(用户){ 返回(null,用户完成) 其他}{ 返回完成(null,假) } } }) })) 出口。verifyUser=护照。验证(jwt,{会话:假})//使用jwt就不再需要会话保存用户数据了。
5。用户申请登录时把jwt给前端
//线路/users.js … var=需要进行身份验证(“. ./authticate”) 路由器。邮报》('/登录',passport.authenticate(当地的),(点播,res)=比;{//登录时还是使用passport-local var牌=进行身份验证。getToken ({_id: req.user._id})//得到签发后的jwt res.statusCode=200 res.setHeader(“内容类型”、“application/json”) res.json({成功:真的,令牌:令牌,状态:“你成功登录!”}) })
6。前端保存牌
//使用localStorage . ajax({美元 类型:“文章”, 数据类型:json, url:“用户/登录”, 数据:{ 用户名:“联合国”, 密码:“pw” }, 成功:函数(res) { localStorage。令牌=getToken (res) }, 错误:函数(err) {…} })//还可以使用vux方法。//还可以使用封装axios方法。
7。用户登录超时
jsonwebtoken验证jwt后,若结果不通过,会有3种错误类型。分别是
TokenExpiredError//当牌超时时抛出。
呃={ 名称:“TokenExpiredError”, 按摩:“jwt过期”, 过期(ExpDate): } JsonWebTokenError
jwt错误
呃={ 名称:“JsonWebTokenError”, 消息:“jwt畸形”//癹wt畸形”,“jwt签名要求”,“无效的签名”、“jwt观众无效。预期:[选项观众)”、“jwt发行人无效。预期:[期权发行人]”、“jwt id无效。预期:[选项JWT ID]”、“JWT无效。预期:选择话题 }表达框架中使用jwt实现验证的方法