token
- 思想
在服务端不需要存储用户的登录记录,全部发给客户端有客户端自己存(cookie,local)
步骤
1、客户端使用用户名跟密码请求登录
2、服务端收到请求,去验证用户名与密码
3、验证成功后,服务端会签发一个 Token(加了密的字符串),再把这个 Token 发送给客户端
4、客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
实现
jsonwebtoken的安装引入
let jwt = require('jsonwebtoken')
生成标签名
let token = jwt.sign(payload, secretOrPrivateKey, [options, callback])
校验token
jwt.verify(token, secretOrPublicKey, [options, callback])
token删除
有客户端,负责删除
多服务器粘性问题
- 当在应用中进行 session的读,写或者删除操作时,会有一个文件操作发生在操作系统的temp 文件夹下,至少在第一次时。假设有多台服务器并且 session 在第一台服务上创建。当你再次发送请求并且这个请求落在另一台服务器上,session 信息并不存在并且会获得一个“未认证”的响应。我知道,你可以通过一个粘性 session 解决这个问题。然而,在基于 token 的认证中,这个问题很自然就被解决了。没有粘性 session 的问题,因为在每个发送到服务器的请求中这个请求的 token 都会被拦截
文件上传
思想
- 前端表单->后端接收到文件本身->保存到服务器上->给数据库记录文件一些信息->库返回给nodejs相关信息->nodejs返回给前端
前端: <input type=file enctype="multipart/form-data" name="fieldname"
实现
- multer->文件名会随机->fs模块改名->path系统模块解析磁盘路径
后端:multer 接受 form-data编码数据
实例
let express = require("express")
let app = express()
let bodyParser = require("body-parser")
//引入jsonwebtoken模块
let jwt = require("jsonwebtoken")
app.listen(3000,()=>console.log("3000端口正在监听中..."))
app.use(bodyParser())
//请求登录,服务端生成token令牌
app.get("/api/login",(req,res)=>{
//1.获取username,password 进行数据库的验证
//2.生成token令牌
let token = jwt.sign({
username:req.query.username
},"nz1906",{
expiresIn:60 //过期时间,按照秒算
})
// console.log(token)
//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;
//2.校验token
jwt.verify(token,"nz1906",(err,decode)=>{
// console.log("err",err) //null就代表没有报错
console.log("decode",decode)
if(err){ //一旦报错了,说明用户信息校验失败
res.send({
err:1,
msg:"当前登录失败,token失效了!"
})
}else{ //校验成功
//3.数据返回给前端
res.send({
err:0,
msg:"成功!",
data:"库数据"
})
}
})
})