欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

token的简单使用

程序员文章站 2022-07-14 09:17:05
...
身份验证:

HTTP 是一种没有状态的协议,也就是它并不知道是谁在访问。客户端用户名密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证。

token定义:

token是服务端生成的一串字符串,作为客户端进行请求的一个令牌,第一次登录后,服务器生成一个token并返回给客户端,客户端再次请求时,只需携带token即可,很大程度上减轻了服务器的压力,不用频繁的查询数据库。

思想:

1、客户端使用用户名跟密码请求登录
2、服务端收到请求,去验证用户名与密码
​ 3、验证成功后,服务端会签发一个 Token(加了密的字符串),再把这个 Token 发送给客户端
​ 4、客户端收到 Token 以后可以把它存储起来,可放在 Cookie 或LocalStorage 里
​ 5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
​ 6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
在服务端不需要存储用户的登录记录,全部发给客户端由客户端自己存,与session相比较为安全

实现过程:

1.安装引入jsonwebtoken

npm i jsonwebtoken -S
const jwt = require('jsonwebtoken');

2.生成token

 let token = jwt.sign(payload, secretOrPrivateKey, [options, callback])
*[^payload]: json 还有username,userid
[^secretOrPrivateKey]: 加密规则,字符串,或者私钥path模块
[^options]: 可选配置项  expiresIn为过期时间,以秒为单位
[^callback]: 成功回调, 可选 返回制作后的token,也可同步返回*
app.post('/login',(req,res)=>{
  //获取用户名
    let username = req.body.username;
    //兜库
    mongoCt.connect('mongodb://127.0.0.1:27017',(err,client)=>{ //连接数据库
        let db = client.db('newbalance');//newbalance为库名
        let user = db.collection('vip');//vip为表名
        user.find({username:username},{projection:{key:0}}).toArray((err,result)=>{//查询数据库中是否有该信息
            if(result.length>0){
                //如果查询结果不为0,则数据库有信息,生成token
                let token = jwt.sign({
                    username: username,
                    user_id: result[0]._id,
                }, 'nz1909', {
                    expiresIn: 60*10 //过期时间 , 秒结算
                })
                //返回
                res.send({
                    err: 0,
                    msg: '登录成功',
                    token: token
                  })
            }else{
                res.send({
                    err: 1,
                    msg: '登录失败'
                  })
            }
        })
    }) 
})

3.校验token

jwt.verify(token, secretOrPublicKey, [options, callback])

[^token] : 制作后的token
[^secretOrPublicKey]: 解密规则,字符串,或者公钥
[^callback:]: 回调 err 错误信息 decode 成功后的信息

app.get('/api/user', (req, res) => {
  //1. 获取token
  let token = req.query.token || req.body.token || req.headers.token;
  //2. 校验token
  // jwt.verify(token, secretOrPublicKey, [options, callback])
  jwt.verify(token, 'nz1909', (err, decode) => {
    if(err){//校验失败了
      //返回失败数据
      res.send({
        err:1,
        msg:'未登录,或过期'
      })
    }else{//校验成功
      //3. 获取数据(求库)
      //4. 返回成功数据
      res.send({
        err:0,
        msg:'成功',
      })
    }
  })