token鉴权登录的优势:无状态、可以跨域、可以防止csrf、性能好(每次请求不用去服务器查询相应的session),客户端只需要将token存入本地,每次访问服务端headers加上token即可
实现:
安装jwt npm install jsonwebtoken --save
导入包:const jwt=require('jsonwebtoken')
基本使用:
const jwt=require('jsonwebtoken')
let token = jwt.sign({user: '1234'}, 'Fizz', {expiresIn: 60 * 60})
console.log(token)
jwt.verify(token, 'Fizz', function (err, data) {
if (err) console.log(err)
else console.log('解析的数据', data)
})
实际应用:
封装 token 的创建和验证:
const jwt=require('jsonwebtoken')
const screat='frdyhdrustgsdt'
function createToken(payload){
//产生token
payload.ctime=Date.now() //创建时间
//可加其他字段
return jwt.sign(payload,screat,{expiresIn: 60}) //设置过期时间60s
}
//验证token
function checkToken(token){
return new Promise((resolve,reject)=>{
jwt.verify(token,screat,(err,data)=>{
console.log(data)
if(err) reject('token 验证失败')
else resolve(data)
})
})
}
module.exports={
createToken,checkToken
}
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
用户登录成功后返回token:
let token=jwt.createToken({id:data.id,name:data.name})
res.status(200).send({success:"true",token:token, msg: "登录成功"})
需要注意的是:
Payload 部分是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段:默认是不加密的,任何人都可以读到,不要把秘密信息放在这个部分。也使用 Base64URL 算法转成字符串。
可查看官方https://www.npmjs.com/package/jsonwebtoken#token-expiration-exp-claim
登录成功后, 客户端进行其他操作时,请求携带上token,服务器端进行验证:
//检查token
app.use((req,res)=>{
let token=req.headers.authorization
jwt.checkToken(token)
.then((data)=>{
console.log(data)
next()
})
.catch((err)=>{
res.send({err:-1,msg:"'token非法"})
})
})