jwt鉴权

文章讲述了在Node.js中如何使用router设置和获取cookie,以及如何通过jsonwebtoken进行登录认证,包括生成和验证token的过程。还提到使用express-jwt简化JWT认证的配置。
摘要由CSDN通过智能技术生成

Node中设置和获取cookie

设置cookie:

router.get(“/setcookie”,(req,res)=>{

//日期时间比较

let str="2001-09-09 23:02:12"

let str1="2001-09-10 23:02:12"

let time=new Date(str)  //将str转换

let time1=new Date(str1)

console.log(time);  

console.log(time.getTime())   //转换为时间戳

console.log(time.getTime()>time1.getTime());

let now=new Date() //当前时间

now.setDate(now.getDate()+2)  //两天后过期

// console.log(now);

res.cookie(‘username’,’admin’,{expires:now})  //设置两天后过期

res.cookie(‘password’,’123456’,{maxAge:1000*60*60*24*2}) //设置两天后过期

res.cookie(‘userinfo’,{name:”zs”,age:12})

res.send({

Code:200,

Msg:”设置cookie”,

//将存储的cookie返回给客户端

Cookie:req.cookies

})

})

获取cookie

router.get(“/getcookie”,(req,res)=>{

Console.log(req.cookies)

})

登录认证过程

  1. 安装jsonwebtoken用于生成或认证token
  2. 导入jwt 在哪个模块用就在哪个模块导入

导入:var jwt=require(‘jsonwebtoken’)

生成token : jwt.sign(对象,口令,{设置token的过期时间})

认证token:jwt.verify()

  1. 定义登录接口

登陆成功后生成token

生成token

  1. 安装jwt:

Npm i jsonwebtoken

  1. 定义登录接口

router.get('/login', async (req, res) => {

  let { username, password } = req.query

  let findUser = await userModel.find({ username })

  console.log(findUser);

  if (findUser.length != 0) {

    if (password === findUser[0].password) {

      let token ="Bearer" + " "  jwt.sign({ username: 'admin' }, 'lce', { expiresIn: '1h' })

      res.send({

        code: 200,

        msg: "登陆成功",

        token

      })

    } else {

      res.send({

        code: 202,

        msg: '密码错误'

      })

    }

  } else {

    res.send({

      code: 201,

      msg: "请先注册"

    })

  }

})

1.前端编写登录页面,点击登录进行账号密码验证,保存token并跳转

2.后端定义购物车接口,接收前端传递过来的token

router.get('/cart',(req,res)=>{

  //认证token,认证用户的登录状态(是否存在,是否过期,是否有效)

  //接收token

  let token=req.headers.authorization

  console.log(token);

 jwt.verify(token, 'lce', (err, data) => {

    if (!token) {

      return console.log('token不存在')

    }

    if (err && err.message === 'jwt expired') {

      return console.log('token已经过期了')

    }

    if (err && err.message === 'invalid token') {

      return console.log('token无效')

    }

  })

  //获取购物车数据

  res.send({

    code:200,

    msg:"购物车数据获取成功",

    data:[{name:"服装",price:2000}]

  })

})

3.跳转之后,当访问购物车接口时,该服务器需要通过token判断登录状态,

 //这里需要将token以请求头的方式传递给服务器

export default function Cart() {

    const getlist=async()=>{

        let {data}=await axios.get('/cart',{

       

             headers:{  //当访问购物车接口时,该服务器需要通过token判断登录状态,

                    //这里需要将token以请求头的方式传递给服务器

                    authorization:sessionStorage.getItem('token')

                }

            

        })

        console.log(data);

    }

    useEffect(()=>{

        getlist()

},[])

到目前为止可以完成验证token 但是jwt.verify方法有点麻烦 所以使用express-jwt解决token认证的问题

1.首先安装在node中 npm i express-jwt@6

2.在app.js中:

首先

Var expressJWT=require(‘express-jwt’)

然后

//配置认证token的中间件

app.use(expressJWT({

  secret: "lce", //解析口令,需要和加密的时候保持一致

  algorithms: ['HS256']  //加密方式,

}).unless({

  //不需要验证token的路径标识(下面的路由都不需要进行token验证(白名单)),如果有上传的路由也需要填写,上传不需要验证token

  path:['/login','/register',{url:/^\/upload/,methods:['GET']}] //上传的图片不能正常显示,需要后面的配置

}))

然后就可以将路由这样删掉,删成这样

后端在获取token时需要 + “Bearer”+ “  ” 

拦截器:

由于每一次请求都需要携带请求头,会增加前端代码量,所以可以设置axios请求拦截器

在前端的index.js文件中进行配置

//axios请求拦截器

axios.interceptors.request.use((item)=>{

  let token=sessionStorage.getItem('token')

  if (token){

    item.headers.Authorization=token

  }

  return item

})

然后就不需要下面这个部分 可以删除

路由表中设置路由守卫

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值