对jwt的理解

json web token

先看写好的

例子

复制代码
const jwt = require("jsonwebtoken");

//加密字符串
const secretKey = "xixihaha";

// 生成token
module.exports.generateToken = function (payload) { 
  const token =
    jwt.sign(payload, secretKey, {
      expiresIn:60*5,//有效时间
    });
  return  "Bearer "+token;//前端写入本地存储,然后写入请求头
};

app.post('/login',async(req,res)=>
{
    const {name,password}=req.body
    let re=await req.app.locals.db.query(`select password,type from userInf where name='${name}'`)
    if(re.recordset[0])
    {
        if (password==re.recordset[0].password)
            {
                let admin=false
                if(re.recordset[0].type.trim()=='0')
                {
                    admin=true
                }
                const token = generateToken(
                    {
                        name:name,
                        admin: admin
                    }
                );
                res.send({
                  code: 200,
                  msg: "注册成功",
                  data: { token },
                });
            }
    }
})

解释

先看一个jwt

复制代码
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYWRtaW4iLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNzIwMjY2MTYwLCJleHAiOjE3MjAyNjY0NjB9.wV545vjMchdShO69hUwT3rGa4gu52yDyqQusUU0cUbY

分为四个部分,'Bearer'以及三个'.',三个.内容分别对应header,payload,signature

第一个.的内容 header

复制代码
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

是对类型和加密算法的base64编码,可以解密

第二个. payload

复制代码
eyJuYW1lIjoiYWRtaW4iLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNzIwMjY2MTYwLCJleHAiOjE3MjAyNjY0NjB9

放一些有标识性的东西,也是base64编码,可逆,所以不能放密码,前面这里传的就是编码前的paload

复制代码
  const token = generateToken(
                    {
                        name:name,
                        admin: admin
                    }
                );

第三个.signature签名

是对编码后的payload,header,以及secretKey,使用header中说明的加密算法,加密后形成

也就是说签名是对payload,header和secretKey加密形成的

在 JWT 中,HeaderPayload 是编码,而 Signature 是基于加密的签名。

为什么能确定用户身份

如果对payload内容进行修改,那么当数据来到后端,再次基于header,payload,secretkey加密得到的结果必定与原有token不一致,进一步说明secerkey的重要性,因为在token中header,payload都只是编码,能保证token唯一性的就是secerkey。

如何使用?

在请求头加上"Bearer"+空格+token,也可以是后端返回token时直接返回加上的

复制代码
 return  "Bearer "+token;//前端写入本地存储,然后写入请求头

为什么加上"Bearer "?

因为有多种认证方式 Basic 认证、Bearer 认证、OAuth 认证,不同方式处理不一样,需要标识

相关推荐
kyriewen1 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
山河木马2 小时前
矩阵专题2-怎么创建视图矩阵(uViewMatrix)
javascript·webgl·计算机图形学
tangdou3690986553 小时前
AI真好玩系列-2分钟快速了解DeepAgents | Quick Guide to DeepAgents in 2 Minutes
前端·javascript·后端
张元清3 小时前
React useIntersectionObserver Hook:懒加载与可见性检测(2026)
javascript·react.js
彭于晏爱编程3 小时前
纯 JS + Node,一个下午手搓了能读懂公司代码的 AI 助手,老板以为我转行了
前端·javascript
妙码生花4 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十四):眨眼小人登录页制作
前端·javascript·ai编程
妙码生花4 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十三):前端路由初始化
前端·javascript·ai编程
PBitW5 小时前
GPT训练我的第四天,被打惨了!!!😭😭😭
前端·javascript·面试
DarkLONGLOVE5 小时前
快速上手 Pinia!Vue3 极简状态管理使用教程
javascript·vue.js
mackbob5 小时前
.eslintrc.js详细配置说明
javascript