JWT验证流程及特点

JWT原理:JWT (JSON Web Token) 是目前最流行的跨域认证解决方案。

验证流程
  • 用户向服务器发送用户名和密码。
  • 服务器验证通过后,生成一个令牌(token)。里面存放着相关数据,比如用户角色、登录时间等。
  • 服务器向用户返回这个令牌(token)。需要用户自己选择某种方式保存起来,一般可以使用
    localStorage、sessionStorage、Cookie 等。
  • 用户随后的每一次请求,需要将令牌(token)通过请求头携带到服务器。请求头字段名由后端指定,一般叫 Authorization。
  • 服务器收到令牌(token),通过解析就能得知用户的身份。
JWT的组成:

在这里插入图片描述
一个JWT实际上就是一个字符串,它由三部分组成:
头部(Header)
载荷(Payload)
签名(signature).

把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

JWT的特点:

1、JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。

2、JWT 不加密的情况下,不能将秘密数据写入 JWT。

3、JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。

4、JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

5、JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

6、为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

NodeJS 中的 jwt 创建与验证
  1. 实现

    jsonwebtoken的安装引入

    let jwt=require('jsonwebtoken')
    

    2.生成token令牌

    let token = jwt.sign(payload,secretOrPrivateKey,[options,callback]
    )
    

    ​ payload:json还有username,userid

    ​ secretOrPrivateKey:加密规则,字符串,或者密匙path模块

    ​ options:可选配置项

    ​ callback:成功回调,可选返回制造后的token,也可同步返回

    //例子
    app.get("/api/login",(req,res)=>{
      //1.获取username,passwors进行数据库的验证
      //2.生成token令牌
      let token = jwt.sign({
         username:req.query.username
      },"hpp",{
          expiresIn:60//过期时间,按照秒算
      })
      res.send({
         err:0,
         msg:"用户登录成功了..",
         data:"库数据",
         token
      })
    })
    

    3.校验token

    jwt.verify(token, secretOrPublicKey, [options, callback])
    
    [^token]: 制作后的token
    [^secretOrPublicKey]: 解密规则,字符串,或者公钥
    [^callback:]: 回调 err 错误信息 decode 成功后的信息
    
    [^options]: expiresIn 过期时间
    
    //例子
    app.get("/api/user",(req,res)=>{ 
        //1.获取客户端传递来的token
        let token=req.query.token || req.body.token || req.headers.token;
        //2.校验token
        jwt.verify(token,"hpp",(err,decode)=>{
            console.log("err",err);
            
            console.log("decode",decode);
            if(err){
                res.send({
                    err:1,
                    msg:"当前登录失败,token失效了"
                })
            }else{
                //校验成功
                //3.数据返回给前端
                res.send({
                    err:0,
                    msg:"成功!",
                    data:"库数据"
                })
            }
            
        })
    })
    

=========================================================
参考链接:
阮一峰大神 - JSON Web Token 入门教程 link.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值