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)
})
登录认证过程
- 安装jsonwebtoken用于生成或认证token
- 导入jwt 在哪个模块用就在哪个模块导入
导入:var jwt=require(‘jsonwebtoken’)
生成token : jwt.sign(对象,口令,{设置token的过期时间})
认证token:jwt.verify()
- 定义登录接口
登陆成功后生成token
生成token
- 安装jwt:
Npm i jsonwebtoken
- 定义登录接口
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
})
然后就不需要下面这个部分 可以删除
路由表中设置路由守卫