通过一个案例理解 JWT

JWT——概念、认证流程、结构、使用JWT、SpringBoot整合JWT 一、什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. 阅读详情

在这里插入图片描述


阅读原文


JWT 简述

JWT(json web token)是为了在网络应用环境之间传递声明而基于 json 的开放标准,JWT 的声明一般被采用在身份提供者和服务器提供者间传递被认证的身份信息,以便于从资源服务器获取资源。


JWT 的应用场景

JWT 一般用于用户登录上,身份认证在这种场景下,一旦用户登录完成,在接下来的每个涉及用户权限的请求中都包含 JWT,可以对用户身份、路由、服务和资源的访问权限进行验证。

举一个例子,假如一个电商网站,在用户登录以后,需要验证用户的地方其实有很多,比如购物车,订单页,个人中心等等,访问这些页面正常的逻辑是先验证用户权限和登录状态,如果验证通过,则进入访问的页面,否则重定向到登录页。

而在 JWT 之前,这样的验证我们大多都是通过 cookie 和 session 去实现的,我们接下来就来对比以下这两种方式的不同。


JWT 对比 cookie/session

cookie/session 的过程:

由于浏览器的请求是无状态的,cookie 的存在就是为了带给服务器一些状态信息,服务器在接收到请求时会对其进行验证(其实是在登录时,服务器发给浏览器的),如果验证通过则正常返回结果,如果验证不通过则重定向到登录页,而服务器是根据 session 中存储的结果和收到的信息进行对比决定是否验证通过,当然这里只是简述过程。

cookie/session 的问题:

从上面可以看出服务器种植 cookie 后每次请求都会带上 cookie,浪费带宽,而且 cookie 不支持跨域,不方便与其他的系统之间进行跨域访问,而服务器会用 session 来存储这些用户验证的信息,这样浪费了服务器的内存,当多个服务器想要共享 session 需要都拷贝过去。

JWT 的过程:

当用户发送请求,将用户信息带给服务器的时候,服务器不再像过去一样存储在 session 中,而是将浏览器发来的内容通过内部的密钥加上这些信息,使用 sha256 和 RSA 等加密算法生成一个 token 令牌和用户信息一起返回给浏览器,当涉及验证用户的所有请求只需要将这个 token 和用户信息发送给服务器,而服务器将用户信息和自己的密钥通过既定好的算法进行签名,然后将发来的签名和生成的签名比较,严格相等则说明用户信息没被篡改和伪造,验证通过。

JWT 的过程中,服务器不再需要额外的内存存储用户信息,和多个服务器之间只需要共享密钥就可以让多个服务器都有验证能力,同时也解决了 cookie 不能跨域的问题。


JWT 的结构

JWT 之所以能被作为一种声明传递的标准是因为它有自己的结构,并不是随便的发个 token 就可以的,JWT 用于生成 token 的结构有三个部分,使用 . 隔开。

1、Header

Header 头部中主要包含两部分,token 类型和加密算法,如 {typ: "jwt", alg: "HS256"},HS256 就是指 sha256 算法,会将这个对象转成 base64。

2、Payload

Payload 负载就是存放有效信息的地方,有效信息被分为标准中注册的声明、公共的声明和私有的声明。

(1) 标准中注册的声明

下面是标准中注册的声明,建议但不强制使用。

  • iss:jwt 签发者;
  • sub:jwt 所面向的用户;
  • aud:接收 jwt 的一方;
  • exp:jwt 的过期时间,这个过期时间必须要大于签发时间,这是一个秒数;
  • nbf:定义在什么时间之前,该 jwt 都是不可用的;
  • iat:jwt 的签发时间。

上面的标准中注册的声明中常用的有 exp 和 nbf。

(2) 公共声明

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部分在客户端可解密,如 {"id", username: "panda", adress: "Beijing"},会将这个对象转成 base64。

(3) 私有声明

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为 base64 是对称解密的,意味着该部分信息可以归类为明文信息。

3、Signature

Signature 这一部分指将 Header 和 Payload 通过密钥 secret 和加盐算法进行加密后生成的签名,secret,密钥保存在服务端,不会发送给任何人,所以 JWT 的传输方式是很安全的。

最后将三部分使用 . 连接成字符串,就是要返回给浏览器的 token 浏览器一般会将这个 token 存储在 localStorge 以备其他需要验证用户的请求使用。

经过上面对 JWT 的叙述可能还是没有完全的理解什么是 JWT,具体怎么操作的,我们接下来实现一个小的案例,为了方便,服务端使用 express 框架,数据库使用 mongo 来存储用户信息,前端使用 Vue 来实现,做一个登录页登录后进入订单页验证 token 的功能。


文件目录

jwt-apply
|- jwt-client
| |- src
| | |- views
| | | |- Login.vue
| | | |- Order.vue
| | |- App.vue
| | |- axios.js
| | |- main.js
| | |- router.js
| |- .gitignore
| |- babel.config
| |- package.json
|- jwt-server
| |- model
| | |- user.js
| |- app.js
| |- config.js
| |- jwt-simple.js
| |- package.json


服务端的实现

在搭建服务端之前需要安装我们使用的依赖,这里我们使用 yarn 来安装,命令如下。

yarn add express body-parse mongoose jwt-simple

1、配置文件

// 文件位置:~jwt-apply/jwt-server/config.js
module.exports = {
    "db_url": "mongodb://localhost:27017/jwt", // 操作 mongo 自动生成这个数据库
    "secret": "pandashen" // 密钥
};

上面配置文件中,db_url 存储的是 mango 数据库的地址,操作数据库自动创建,secret 是用来生成 token 的密钥。

2、创建数据库模型

// 文件位置:~jwt-apply/jwt-server/model/user.js
// 操作数据库的逻辑
const mongoose = require("mongoose");
let { db_url } = require("../config");

// 连接数据库,端口默认 27017
mongoose.connect(db_url, {
    useNewUrlParser: true // 去掉警告
});

// 创建一个骨架 Schema,数据会按照这个骨架格式存储
let UserSchema = new mongoose.Schema({
    username: String,
    password: String
});

// 创建一个模型
module.exports = mongoose.model("User", UserSchema);

我们将连接数据库、定义数据库字段和值类型以及创建数据模型的代码统一放在了 model 文件夹下的 user.js 当中,将数据模型导出方便在服务器的代码中进行查找操作。

3、实现基本服务

// 文件位置:~jwt-apply/jwt-server/app.js
const express = require("express");
const bodyParser = require('body-parser');
const jwt = require("jwt-simple");
const User = require("./model/user");
let { secret } = require("./config");

// 创建服务器
const app = express();

/**
* 设置中间件
*/

/**
* 注册接口
*/

/**
* 登录接口
*/

/**
* 验证 token 接口
*/

// 监听端口号
app.listen(3000);

上面是一个基本的服务器,引入了相关的依赖,能保证启动,接下来添加处理 post 请求的中间件和实现 cors 跨域的中间件。

4、添加中间件

// 文件位置:~jwt-apply/jwt-server/app.js
// 设置跨域中间件
app.use((req, res, next) => {
    // 允许跨域的头
    res.setHeader("Access-Control-Allow-Origin", "*");

    // 允许浏览器发送的头
    res.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization");

    // 允许哪些请求方法
    res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");

    // 如果当前请求是 OPTIONS 直接结束,否则继续执行
    req.method === "OPTIONS" ? res.end() : next();
});

// 设置处理 post 请求参数的中间件
app.use(bodyParser.json());

之所以设置处理 post 请求参数中间件是因为注册和登录都需要使用 post 请求,之所以设置跨域中间件是因为我们项目虽小也是前后端分离的,需要用前端的 8080 端口访问服务器的 3000 端口,所以需要服务端使用 cors 处理跨域问题。

5、注册接口的实现

// 文件位置:~jwt-apply/jwt-server/app.js
// 注册接口的实现
app.post("/reg", async (req, res, next) => {
    // 获取 post 请求的数据
    let user = req.body;

    // 错误验证
    try {
        // 存入数据库,添加成功后返回的就是添加后的结果
        user = await User.create(user);

        // 返回注册成功的信息
        res.json({
            code: 0,
            data: {
                user: {
                    id: user._id,
                    username: user.username
                }
            }
        });
    } catch (e) {
        // 返回注册失败的信息
        res.json({ code: 1, data: "注册失败" });
    }
});

上面将用户注册的信息存入了 mongo 数据库,返回值为存入的数据,如果存入成功,则返回注册成功的信息,否则返回注册失败的信息。

6、登录接口的实现

// 文件位置:~jwt-apply/jwt-server/app.js
// 用户能登录
app.post("/login", async (req, res, next) => {
    let user = req.body;
    try {
        // 查找用户是否存在
        user = await User.findOne(user);

        if (user) {
            // 生成 token
            let token = jwt.encode({
                id: user._id,
                username: user.username,
                exp: Date.now() + 1000 * 10
            }, secret);

            res.json({
                code: 0,
                data: { token }
            });
        } else {
            res.json({ code: 1, data: "用户不存在" });
        }
    } catch (e) {
        res.json({ code: 1, data: "登录失败" });
    }
});

登录的过程中会先拿用户的账号和密码进数据库中进行严重和查找,如果存在,则登录成功并返回 token,如果不存在则登录失败。

7、token 校验接口

// 文件位置:~jwt-apply/jwt-server/app.js
// 只针对 token 校验接口的中间件
let auth = (req, res, next) => {
    // 获取请求头 authorization
    let authorization = req.headers["authorization"];
    // 如果存在,则获取 token
    if (authorization) {
        let token = authorization.split(" ")[1];
        try {
            // 对 token 进行校验
            req.user = jwt.decode(token, secret);
            next();
        } catch (e) {
            res.status(401).send("Not Allowed");
        }
    } else {
        res.status(401).send("Not Allowed");
    }
}

// 用户可以校验是否登录过,通过请求头 authorization: Bearer token
app.get("/order", auth, (req, res, next) => {
    res.json({
        code: 0,
        data: {
            user: req.user
        }
    });
});

在校验过程中,每次浏览器都会将 token 通过请求头 authorization 带给服务器,请求头的值为 Bearer token,这是 JWT 规定的,服务器取出 token 使用 decode 方法进行解码,并使用 try...catch 进行捕获,如果解码失败则会触发 try...catch,说明 token 过期、被篡改、或被伪造,返回 401 响应。


前端的实现

我们使用 3.0 版本的 vue-cli 脚手架生成 Vue 项目,并安装 axios 发送请求。

yarn add global @vue/cli

yarn add axios

1、入口文件

// 文件位置:~jwt-apply/jwt-client/src/main.js
import Vue from "vue"
import App from "./App.vue"
import router from "./router"

// 是否为生产模式
Vue.config.productionTip = false

new Vue({
    router,
    render: h => h(App)
}).$mount("#app")

上面这个文件是 vue-cli 自动生成的,我们并没有做改动,但是为了方便查看我们会将主要文件的代码一一贴出来。

2、主组件 App

<!-- 文件位置:&#126;jwt-apply/jwt-client/src/App.vue -->
<template>
    <div id="app">
        <div id="nav">
            <router-link to="/login">登录</router-link> |
            <router-link to="/order">订单</router-link>
        </div>
        <router-view/>
    </div>
</template>

在主组件中我们将 router-link 分别对应了 /login 和 /order 两个路由。

3、路由配置

// 文件位置:&#126;jwt-apply/jwt-client/src/router.js
import Vue from "vue"
import Router from "vue-router"
import Login from "./views/Login.vue"
import Order from "./views/Order.vue"

Vue.use(Router)

export default new Router({
    mode: "history",
    base: process.env.BASE_URL,
    routes: [
        {
            path: "/login",
            name: "login",
            component: Login
        },
        {
            path: "/order",
            name: "order",
            component: Order
        }
    ]
})

我们定义了两个路由,一个对应登录页,一个对应订单页,并引入了组件 Login 和 Order,前端并没有写注册模块,可以使用 postman 发送注册请求生成一个账户以备后面验证使用。

4、登录组件 Login

<!-- 文件位置:&#126;jwt-apply/jwt-client/src/views/Login.vue -->
<template>
    <div class="login">
        用户名
        <input type="text" v-model="user.username">
        密码
        <input type="text" v-model="user.password">
        <button @click="login">提交</button>
    </div>
</template>

<script>
import axios from "../axios"
export default {
    data() {
        return {
            user: {
                username: "",
                password: ""
            }
        }
    },
    methods: {
        login() {
            // 发送请求访问服务器的登录接口
            axios.post('/login', this.user).then(res => {
                // 将返回的 token 存入 localStorage,并跳转订单页
                localStorage.setItem("token", res.data.token);
                this.$router.push("/order");
            }).catch(err => {
                // 弹出错误
                alert(err.data);
            });
        }
    }
}
</script>

Login 组件中将两个输入框的值同步到 data 中,用来存放账号和密码,当点击提交按钮时,触发点击事件 login 发送请求,请求成功后将返回的 token 存入 localStorage,并跳转路由到订单页,请求错误时弹出错误信息。

5、订单组件 Order

<!-- 文件位置:&#126;jwt-apply/jwt-client/src/views/Order.vue -->
<template>
    <div class="order">
        {{username}} 的订单
    </div>
</template>

<script>
import axios from "../axios"
export default {
    data() {
        return {
            username: ""
        }
    },
    mounted() {
        axios.get("/order").then(res =>{
            this.username = res.data.user.username;
        }).catch(err => {
            alert(err);
        });
    },
}
</script>

Order 页面显示的内容是 “XXX 的订单”,在加载 Order 组件被挂载时发送请求获取用户名,即访问服务器的验证 token 接口,因为订单页就是一个涉及到验证用户的页面,当请求成功时,将用户名同步到 data,否则弹出错误信息。

在 Login 和 Order 两个组件中对请求的回调内似乎写的太简单了,其实是因为 axios 的返回值会在服务器返回的返回值外面包了一层,存放一些 http 响应的相关信息,两个接口访问时请求地址也是同一个服务器,而且在服务器响应时的错误处理都是对状态吗 401 的处理,在涉及验证用户信息的请求中需要设置请求头 Authorization 发送 token。

这些逻辑我们似乎在组件请求相关的代码中都没有看到,是因为我们使用 axios 的 API 设置了 baseURL 请求拦截和响应拦截,细心可以发现其实引入的 axios 并不是直接从 node_modules 引入,而是引入了我们自己的导出的 axios。

6、axios 配置

// 文件位置:&#126;jwt-apply/jwt-client/src/axios.js
import axios from "axios";
import router from "./router";

// 设置默认访问地址
axios.defaults.baseURL = "http://localhost:3000";

// 响应拦截
axios.interceptors.response.use(res => {
    // 报错执行 axios then 方法错误的回调,成功返回正确的数据
    return res.data.code !== 0 ? Promise.reject(res.data) : res.data;
}, res => {
    // 如果 token 验证失败则跳回登陆页,并执行 axios then 方法错误的回调
    if (res.response.status === 401) {
        router.history.push("/login");
    }
    return Promise.reject("Not Allowed");
});

// 请求拦截,用于将请求统一带上 token
axios.interceptors.request.use(config => {
    // 在 localStorage 获取 token
    let token = localStorage.getItem("token");

    // 如果存在则设置请求头
    if (token) {
        config.headers.Authorization = `Bearer ${token}`;
    }

    return config;
});

export default axios;

访问服务器时会将 axios 中的第一个参数拼接在 axios.defaults.baseURL 的后面作为请求地址。

axios.interceptors.response.use 为响应拦截,axios 发送请求后所有的响应都会先执行这个方法内部的逻辑,返回值为数据,作为参数传递给 axios 返回值的 then 方法。

axios.interceptors.request.use 为请求拦截,axios 发送的所有请求都会先执行这个方法的逻辑,然后发送给服务器,一般用来设置请求头。


jwt-simple 模块的实现原理

相信通过上面的过程已经非常清楚 JWT 如何生成的,token 的格式是怎样的,如何跟前端交互去验证 token,我们在这些基础上再深入的研究一下 token 的整个生成过程和验证过程,我们使用的 jwt-simple 模块的 encode 方法如何生成 token,使用 decode 方法如何验证 token,下面就看看一看 jwt-simple 的实现原理。

1、创建模块

// 文件位置:&#126;jwt-apply/jwt-server/jwt-simple.js
const crypto = require("crypto");

/**
* 其他方法
*/

// 创建对象
module.exports = {
    encode,
    decode
};

我们知道 jwt-simple 我们使用的有两个方法 encode 和 decode,所以最后导出的对象上有这两个方法,使用加盐算法进行签名需要使用 crypto,所以我们提前引入。

2、字符串和 Base64 互相转换

// 文件位置:&#126;jwt-apply/jwt-server/jwt-simple.js
// 将子子符串转换成 Base64
function stringToBase64(str) {
    return Buffer.from(str).toString("base64");
}

// 将 Base64 转换成字符串
function base64ToString(base64) {
    return Buffer.from(base64, "base64").toString("utf8");
}

从方法的名字相信很容易看出用途和参数,所以就一起放在这了,其实本质是在两种编码之间进行转换,所以转换之前都应该先转换成 Buffer。

3、生成签名的方法

// 文件位置:&#126;jwt-apply/jwt-server/jwt-simple.js
function createSign(str, secret) {
    // 使用加盐算法进行加密
    return crypto.createHmac("sha256", secret).update(str).digest("base64");
}

这一步就是通过加盐算法使用 sha256 和密钥 secret 进行生成签名,但是为了方便我们把使用的加密算法给写死了,正常情况下是应该根据 Header 中 alg 字段的值去检索 alg 的值与加密算法名称对应的 map,去使用设置的算法生成签名。

4、encode

// 文件位置:&#126;jwt-apply/jwt-server/jwt-simple.js
function encode(payload, secret) {
    // 头部
    let header = stringToBase64(JSON.stringify({
        typ: "JWT",
        alg: "HS256"
    }));

    // 负载
    let content = stringToBase64(JSON.stringify(payload));

    // 签名
    let sign = createSign([header, content].join("."), secret);

    // 生成签名
    return [header, content, sign].join(".");
}

在 encode 中将 Header、Payload 转换成 base64,通过 . 连接在一起,然后使用 secret 密钥生成签名,最后将 Header 和 Payload 的 base64 通过 . 和生成的签名连接在一起,这就形成了 “明文” + “明文” + “暗文” 三段格式的 token。

5、decode

// 文件位置:&#126;jwt-apply/jwt-server/jwt-simple.js
function decode(token, secret) {
    let [header, content, sign] = token.split(".");

    // 将接收到的 token 的前两部分(base64)重新签名并验证,验证不通过抛出错误
    if (sign !== createSign([header, content].join("."), secret)) {
        throw new Error("Not Allow");
    }

    // 将 content 转成对象
    content = JSON.parse(base64ToString(content));

    // 检测过期时间,如果过去抛出错误
    if (content.exp && content.exp < Date.now()) {
        throw new Error("Not Allow");
    }

    return content;
}

在验证方法 decode 中,首先将 token 的三段分别取出,并用前两段重新生成签名,并与第三段 sign 对比,相同通过验证,不同说明篡改过并抛出错误,将 Payload 的内容重新转换成对象,也就是将 content 转换成对象,取出 exp 字段与当前时间对比来验证是否过期,如果过期抛出错误。


总结

在 JWT 生成的 token 中,前两段明文可解,这样别人拦截后知道了我们的加密算法和规则,也知道我们传输的信息,也可以使用 jwt-simple 加密一段暗文拼接成 token 的格式给服务器去验证,为什么 JWT 还这么安全呢,这就说到了最最重点的地方,无论别人知道多少我们在传输的信息,篡改和伪造后都不能通过服务器的验证,是因为无法获取服务器的密钥 secret,真正能保证安全的就是 secret,同时证明了 Header 和 Payload 并不安全,可以被破解,所以不能存放敏感信息。


JSON Web Token (JWT): 理解与应用 JSON Web Token (JWT) 阅读详情

相关推荐

SpringBoot 中使用 JWT 案例分享详解

SpringBoot 中使用 JWT 案例分享详解

不迁怒,不贰过。小知识,大智慧。 6087

JWT--使用/教程/实例

原文网址: 简介 说明 JWT是常用的TOKEN工具,本文介绍JWT知识。包括:什么是JWT、JWT的消息组成、JWT实战。 官网 官网:JSON Web Tokens - jwt.io (可生成/解析 Token) 简介 JWT简介 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。JWT将用户信息加密到token里,服务器不保存任何用户信息。服务器通...

IT利刃出鞘的博客 3717

Angular之jwt令牌身份验证

Angular之jwt令牌身份验证 demo https://gitee.com/powersky/jwt 介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,...

FlyWine的博客 2692

JWT的介绍和简单使用

基于传统的token认证 用户登录,服务端给返回token,并将token保存在服务端。------>以后用户再来访问时,需要携带token,服务端获取token后,再去数据库中获取token进行校验。 JWT官网:https://jwt.io/ jwt简介 jwt是指JSON Web Token,也就是JSON格式数据使用加密算法加密后按照一定规则生成的一个字符串token 。 官方解释:https://jwt.io/introduction/ jwt试用场景 ​ Authorization

Kings_boy的博客 921

电磁流量计模拟前端电路设计与优化

模拟前端电路(AFE)是传感器信号处理的核心环节,通过放大、滤波和模数转换实现信号调理。其设计需重点考虑放大器共模抑制比(CMRR)和ADC分辨率等关键参数,在电磁流量计等工业测量应用中,AD8220仪表放大器与AD7172-2 Σ-Δ型ADC的组合能有效简化传统多级架构。现代过采样技术结合数字滤波可替代模拟滤波器,显著提升系统集成度与测量精度,这种设计方法同样适用于压力传感、生物电信号采集等需要高精度信号调理的场景。

weixin_42602241的博客 618

SQL-拼多多 面试题:连续3次为球队得分的球员名单

1.使用LAG开窗函数 筛选出 下一次和下下一次得分,并用进球时间进行排序。2.使用where筛选出值得嘉奖的球员。

Ftr1998的博客 643

JWT(JSON Web Token )详解及实例

JSON Web Token (JWT)详解

深圳市多克创新科技有限公司 7560

Windows平台无人机仿真:从零搭建SITL环境与QGC联调

本文详细指导了在Windows平台上从零搭建无人机软件在环(SITL)仿真环境,并与QGroundControl(QGC)进行联调的完整流程。通过使用Cygwin工具链,开发者可以在没有实体硬件的情况下,模拟运行ArduPilot飞控,并通过MAVLink协议连接QGC地面站进行全功能测试,为无人机软件开发提供了一个安全、经济的虚拟沙盒环境。

weixin_29239279的博客 407

【JWT】jwt认证机制认识与理解,go案例实现

JWT(JSON Web Token)是一种轻量级的身份认证机制,广泛应用于现代 Web 开发中,尤其是在分布式系统和微服务中。它通过签名技术确保数据的真实性和完整性。如果票到期(过期时间),你需要重新购买(重新登录)。你拿着票(Token)可以自由进入项目(资源)。假设你去一个游乐园玩,买了一张票(JWT)。

m0_74282926的博客 1616

Windows——Nessus安装(无限制)

Nessus手把手图文安装,解除ip限制~

网安小白的博客 9448

NumPy 与 Pandas 的详细应用(含实例)

本文系统介绍了Python数据分析中NumPy和Pandas两大核心库的应用。NumPy专注于高效数值计算,提供多维数组和向量化运算功能;Pandas则擅长结构化数据处理,支持数据清洗、分组统计等操作。文章详细讲解了库的安装、基础操作(数组/DataFrame创建、索引切片)、进阶功能(缺失值处理、分组聚合),并通过电商销售分析案例演示了实际应用场景。最后总结了二者的协同优势:NumPy负责底层数值计算,Pandas处理高级数据操作,配合使用可显著提升数据处理效率。建议读者从基础操作入手,结合实际案例练习,

weixin_42030577的博客 2297

JWT (JSON Web Token) 综合指南

JWT(JSON Web Token)是一种基于JSON的开放标准,用于安全传输信息。它由头部、载荷和签名三部分组成,通过签名验证数据完整性和身份真实性。JWT的优势包括无状态认证、高效自包含、跨域支持等,适合分布式系统。但需注意载荷信息应避免存储敏感数据,仅包含必要的非机密信息。Python实现中,密钥安全、算法强度和过期时间设置是关键。JWT的核心安全机制在于数字签名而非加密,正确使用可构建高效安全的认证系统。

言之。 1万+

uniapp - 热更新提示:WGT安装包中manifest.json文件不存在 | unexpected EOF!报错详细解决,完美搞定WGT安装包中WWW目录下manifest.json不存在问题

uniapp,安卓android,苹果ios,热更新,热更新code:-1202报错,,WGT热更新报错,uniapp热更新wgt出现报错manifest.json文件不存,uniapp安卓苹果软件热更新时出现错误unexpected EOF!如何解决,怎么解决热更新wgt报错,app新版本下载安装报错WGT安装包中manifest.json文件不存在,WGT安装包中WWW目录下manifest.json不存在,uniapp热更新报错安装失败[-1201]:WGT/WGTU文件格式错误,uniapp-wgt

✅ 精选推荐文章 1万+

JWT了解

1、基础了解,参考文章如下: JSON Web Token 入门教程 - 阮一峰的网络日志

zhizhuodewo6的博客 334

24. SAP 标准产品里使用 OData 服务的一些细节分享

笔者在编写使用事物码 SEGW 开发 SAP OData 服务的系列步骤时,但凡遇到技术上一些疑难问题,喜欢去参照 SAP 标准产品里是如何使用 OData 服务的,不少问题都可以去参考 SAP 标准产品的 OData 服务实现细节来解决。 因此本文记录笔者在编写本教程的过程中,曾经研究过的 SAP OData 服务实现的一些细节,把这些细节分享给大家,希望能起到参考作用。 同时,教程也不断收到一些朋友在评论区留言,对于不少留言的回复,我也是拿 SAP 标准 OData 服务的实现作为论据来回复的。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2030

uniapp - 详解使用高德地图在地图上实现绘制边界/点聚合/行政区域高亮等功能,Uniapp高德地图点聚合标记及绘制点线面示例代码(全端兼容H5网页、小程序、安卓app、苹果app、nvue)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,高德地图,uniAPP高德地图实现点聚合,地图区域描边、点标记、点信息详情弹窗,实现绘制边界区域,uniapp H5使用高德地图实现点聚合、行政区域高亮,实现高德地图的marker聚合功能,高德地图进行marker标点,点信息展示,点击标记点弹出对话框,点击聚合点后显示信息模态框,打标点,【Uniapp】高德地图的接入自定义标点与信息窗体使用,绘制行政区域边界,绘制多边形,电子围栏,高德行政区划边界,

✅ 精选推荐文章 1万+

JWT(Json web token)认证详解

官方地址案例jwt使用技巧。

m0_72363694的博客 323

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java 接口 token_Java中使用JWT生成Token进行接口鉴权实现方法

先介绍下利用JWT进行鉴权的思路:1、用户发起登录请求。2、服务端创建一个加密后的JWT信息,作为Token返回。3、在后续请求中JWT信息作为请求头,发给服务端。4、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。流程图如下:一、用户发起登录请求二、服务端创建一个加密后的JWT信息,作为Token返回1、用户登录之后把生成的Token返回给...

weixin_33331063的博客 916

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JWT完整详细攻略

直接链接 https://learnku.com/articles/10885/full-use-of-jwt

weixin_45373940的博客 173

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spring Boot 2 OAuth2 JWT 授权服务器实战指南

Spring Boot 2 OAuth2 JWT 授权服务器实战指南 本指南将引导您了解并部署一个基于Spring Boot 2的OAuth2授权服务器,该服务器利用JWT(JSON Web Tokens)进行安全认证,并结合JPA、Hibernate以及MySQL数据库来存储用户和客户端信息。 1. 项目介绍 Spring Boot 2 OAuth2 JWT 授权服务器 是一个简单的实现,展示了...

gitblog_01137的博客 621

傻傻分不清之 Cookie、Session、Token、JWT

傻傻分不清之 Cookie、Session、Token、JWT 推荐链接(非常详细):https://juejin.cn/post/6844904034181070861

weixin_45867895的博客 294

什么是JWT?深入理解JWT从原理到应用

JWT(JSON Web Token)是一种用于在网络应用间传递和验证信息的开放标准(RFC 7519)。它通过使用数字签名或加密,将一些声明式的信息进行编码,生成一个经过验证的令牌。JWT主要由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

万维网连五洲,二进制写尽天下事,喜欢结识新伙伴寻找志同道合的朋友,欢迎一起探讨学习 8010

JWT 在前后端分离中的应用

1 JWT 介绍及其原理 JWT是我之前做Android应用的时候了解到的一种用户授权机制,虽然原生的移动手机应用与基于浏览器的Web应用之间存在很多差异,但很多情况下后端往往还是沿用已有的架构跟代码,所以用户授权往往还是采用Cookie+Session的方式,也就是需要原生应用中模拟浏览器对Cookie的操作。 Cookie+Session的存在主要是为了解决HTTP这一无状态协议下服务...

蔡志伟的博客 942
上一篇: MySQL —— 简单聊一聊数据库设计
下一篇: NodeJS 使用 cookie 和 session
Panda Shen
博客等级 码龄10年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值