token的使用

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:"库数据"
            })
        }
    })
})



发布了6 篇原创文章 · 获赞 4 · 访问量 184

猜你喜欢

转载自blog.csdn.net/Black_snow_ji/article/details/104826407