token
思想
在服务端不需要存储用户的登陆记录,全部将信息发送给客户端自己存储(cookie或者localstroage)
1.客户端输入用户名和密码进行请求登录
2.服务端接受到请求,都数据库进行验证用户名和密码
3.验证成功之后,服务端返回给客户端一个加了密的token
4.客户端收到token之后将其存到cookie或者localstroage中
5.客户端每次向服务端发起请求的时候需要携带者token
6.服务端接收到请求,验证客户端请求里面携带的token,如果验证成功就返回客户端请求的数据
实现
需要jsonwentoken第三方插件的安装引入
let jwt = require('jsonwebtoken')
生成token
let token = jwt.sign(payload,secretOrPrivatekey,[options,callback])
//payload:json还有username,useid,即要加密的对象
//secretOrPrivateKey:加密规则,字符串,或者私钥path模块
//options:可选配置项
//callback:成功的回调,可选,返回制作后的token,也可同步返回
校验token
jwt.verify(token,secretOrPublicKey,[options,callback])
//token:制作后的token
//secretOrPublicKey:解密规则,字符串,或者公钥
//options:expiresIn过期时间
//callback:回调 参数err是错误信息 参数decode成功后的信息
token删除
由客户端进行删除
客户端发起请求登录验证
let express = require('express')//导入express模块
let bodyparser = require('body-parser')//导入body-parser中间件,便于获取非地址栏的参数信息
let app = express()//创建服务
app.listen(3000,()=>{console.log('监听3000端口')})
let jwt = require('jsonwebtoken')//引入jsonwebtoken模块
//用户登录的时候,服务端给客户返回一个token令牌
app.get('/api/login',(req,res)=>{
//1.获取username,password进行数据库验证
//2.生成token令牌
let token = jwt.sign({username:req.query.username},'jiamiguize',{expiresIn:60//过期时间,按照秒算})
//3.将token和库信息返回给客户端
res.send({
err:0,
msg:'登陆成功',
data:'库数据',
token
})
})
//校验token
app.get('/api/user',(req,res)=>{
//1。获取用户端传来的token
let token = req.query.token || req.body.token || req.headers.token;
//无论使用何种形式的传递来的参数都能获取到token
jwt.verify(token,"jiamiguize",(err,data)=>{
if(err){//如果err为真,证明token已经失效,校验失败
res.send({
err:1,
mag:'当前登录失败,token失效了'
})
}else{
res.send({
err:0,
msg:'成功',
data:'请求的库数据'
})
}
})
})