亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

JWT 用戶校驗教程:從入門到實踐

標簽:
安全 運維 API
概述

本文详细介绍了JWT用户校验教程,从JWT的基本概念到生成和验证Token的过程,再到实战演练和常见问题解决,帮助读者全面掌握JWT的用户校验方法。JWT用户校验教程涵盖了从入门到实践的所有关键步骤,确保读者能够安全有效地实现用户认证。

JWT 简介

什么是 JWT

JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为JSON对象传输。JWT通常用于身份验证和信息交换。其设计目的是紧凑且自包含,以支持无状态、分布式环境中的安全信息交换。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

JWT 的组成部分

一个完整的JWT由三部分组成,以.分割:

  1. 头部(Header):描述了JWT的类型以及签名所使用的算法,典型内容如下:

    {
     "typ": "JWT",
     "alg": "HS256"
    }
  2. 载荷(Payload):载荷包含了JWT包含的有效信息,如用户ID、用户名、权限等。它分为注册载荷(注册标准中定义的字段)和公共载荷(应用特定的字段),如下:

    {
     "sub": "1234567890",
     "name": "John Doe",
     "admin": true
    }
  3. 签名(Signature):签名用于验证消息的真实性以及完整性。它采用头部信息与载荷信息的组合,通过加密算法生成。其生成方式如下:

    HMACSHA256(
     base64UrlEncode(header) + "." +
     base64UrlEncode(payload),
     secret
    )

JWT 的应用场景

  1. API 访问控制:JWT 可以用于验证访问 API 的用户身份,确保只有授权用户才能访问特定资源。
  2. 跨域认证:JWT 可以用于实现跨域认证,因为它是无状态的,不需要服务器端存储状态信息。
  3. 单点登录(SSO):JWT 适合用于单点登录系统,因为它可以轻松地在多个服务之间共享用户信息。
  4. 信息交换:JWT 可以用于安全地传输信息,因为它是一种紧凑且自包含的格式。
JWT 工作原理

JWT 的生成过程

  1. 创建头部:创建一个包含类型和加密算法的JSON对象,如 {"typ": "JWT", "alg": "HS256"}
  2. 创建载荷:创建包含用户信息或其他需要传输的数据的JSON对象,如 {"sub": "1234567890", "name": "John Doe", "admin": true}
  3. 编码头部和载荷:将头部和载荷分别使用 Base64URL 编码。
  4. 计算签名:使用 HMACSHA256 或其他算法,通过头部和载荷的组合加上一个密钥来计算签名。
  5. 生成JWT:将编码后的头部、载荷和签名使用 . 分隔符连接起来。

示例如下:

const jwt = require('jsonwebtoken');

const secret = 'secretKey';
const payload = {
    sub: '1234567890',
    name: 'John Doe',
    admin: true
};

const token = jwt.sign(payload, secret, { algorithm: 'HS256' });
console.log(token);

JWT 的验证过程

  1. 获取JWT:从请求中的 HTTP 头(如 Authorization 头)或 URL 参数(如 access_token)中获取 JWT。
  2. 验证签名:使用相同算法和密钥重新计算签名,并与 JWT 中的签名进行比较。
  3. 解码载荷:如果签名验证通过,则解码载荷中的信息。
  4. 检查载荷的有效性:根据业务需要检查载荷中的字段,如过期时间等。
  5. 返回结果:根据载荷的有效性返回相应的结果。

示例如下:

const jwt = require('jsonwebtoken');

const secret = 'secretKey';
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6ImpzZXJ2Iiwia2lkIjoibXlfa2V5In0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.5yGv97BPQ5M2XG3ua3GEiUB659IzLkZ3izj6IcZi6_g';

try {
    const decoded = jwt.verify(token, secret, { algorithms: ['HS256'] });
    console.log(decoded);
} catch (error) {
    console.error(error);
}
JWT 用户校验基本步骤

创建 JWT Token

在用户登录时生成一个 JWT Token,并将其发送给客户端。生成 JWT Token 的过程如下:

  1. 获取用户信息:通过用户名和密码验证用户身份。
  2. 创建载荷:将用户信息和其他需要传输的数据编码为 JSON 对象。
  3. 生成 JWT:使用 JWT 库生成 JWT Token。

示例如下:

const jwt = require('jsonwebtoken');
const secret = 'secretKey';
const payload = {
    id: '1234567890',
    name: 'John Doe',
    admin: true
};

const token = jwt.sign(payload, secret, { algorithm: 'HS256' });
console.log(token);

存储 JWT Token

将生成的 JWT Token 发送给客户端,客户端可以将其存储在浏览器的 localStoragesessionStorage 中,或作为 HTTP Cookies 发送到服务器。

示例如下:

// 存储到 localStorage
localStorage.setItem('token', token);

// 存储到 session Storage
sessionStorage.setItem('token', token);

// 发送 Cookie
res.cookie('access_token', token, {
    httpOnly: true,
    secure: true,
    sameSite: 'strict'
});

验证 JWT Token

在每次请求时验证 JWT Token 的有效性和完整性。验证 JWT Token 的过程如下:

  1. 获取 JWT Token:从请求中的 HTTP 头(如 Authorization 头)或 URL 参数(如 access_token)中获取 JWT。
  2. 验证签名:使用相同算法和密钥重新计算签名,并与 JWT 中的签名进行比较。
  3. 解码载荷:如果签名验证通过,则解码载荷中的信息。
  4. 检查载荷的有效性:根据业务需要检查载荷中的字段,如过期时间等。
  5. 返回结果:根据载荷的有效性返回相应的结果。

示例如下:

const jwt = require('jsonwebtoken');
const secret = 'secretKey';
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6ImpzZXJ2Iiwia2lkIjoibXlfa2V5In0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.5yGv97BPQ5M2XG3ua3GEiUB659IzLkZ3izj6IcZi6_g';

try {
    const decoded = jwt.verify(token, secret, { algorithms: ['HS256'] });
    console.log(decoded);
} catch (error) {
    console.error(error);
}
实战演练:使用 JWT 进行用户校验

示例代码

创建 JWT Token

在用户登录时生成 JWT Token,并将 JWT Token 发送给客户端。

示例如下:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const secret = 'secretKey';

app.post('/login', (req, res) => {
    const { username, password } = req.body;

    // 模拟用户验证逻辑
    if (username === 'john' && password === 'password') {
        const payload = {
            id: '1234567890',
            name: 'John Doe',
            admin: true
        };
        const token = jwt.sign(payload, secret, { algorithm: 'HS256' });
        res.json({ token });
    } else {
        res.status(401).json({ error: 'Unauthorized' });
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

验证 JWT Token

在每次请求时验证 JWT Token 的有效性和完整性,并根据验证结果返回相应的数据。

示例如下:

app.use((req, res, next) => {
    const token = req.headers['authorization'] && req.headers['authorization'].split(' ')[1];
    if (token) {
        jwt.verify(token, secret, { algorithms: ['HS256'] }, (err, decoded) => {
            if (err) {
                return res.status(401).json({ error: 'Unauthorized' });
            }
            req.user = decoded;
            next();
        });
    } else {
        res.status(401).json({ error: 'Unauthorized' });
    }
});

app.get('/protected', (req, res) => {
    if (req.user.admin) {
        res.json({ message: 'Admin content' });
    } else {
        res.status(403).json({ error: 'Forbidden' });
    }
});

部署与测试

将上述代码部署到服务器,并使用 Postman 或其他工具测试登录和请求受保护资源的功能。

  1. 登录请求

    POST /login
    Content-Type: application/json
    
    {
     "username": "john",
     "password": "password"
    }

    响应:

    {
     "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6ImpzZXJ2Iiwia2lkIjoibXlfa2V5In0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.5yGv97BPQ5M2XG3ua3GEiUB659IzLkZ3izj6IcZi6_g"
    }
  2. 请求受保护资源

    GET /protected
    Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6ImpzZXJ2Iiwia2lkIjoibXlfa2V5In0.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.5yGv97BPQ5M2XG3ua3GEiUB659IzLkZ3izj6IcZi6_g

    响应:

    {
     "message": "Admin content"
    }
常见问题与解决方案

Token 失效处理

Token 失效是一种常见的问题,通常发生在以下情况:

  1. Token 过期:Token 有固定的有效时间,一旦超过该时间就会失效。
  2. Token 被篡改:如果 Token 被篡改,验证过程会失败。

解决方案

  1. 设置合理的过期时间:根据应用需求设置合适的过期时间。
  2. 自动刷新 Token:在 Token 接近过期时,客户端自动刷新 Token。
  3. 使用 Refresh Token:使用 Refresh Token 生成新的 Access Token。

示例如下:

app.post('/refresh-token', (req, res) => {
    const { refreshToken } = req.body;

    jwt.verify(refreshToken, refreshSecret, { algorithms: ['HS256'] }, (err, decoded) => {
        if (err) {
            return res.status(401).json({ error: 'Unauthorized' });
        }
        const newPayload = {
            id: decoded.id,
            name: decoded.name,
            admin: decoded.admin
        };
        const newToken = jwt.sign(newPayload, secret, { algorithm: 'HS256' });
        res.json({ token: newToken });
    });
});

Token 伪造防范

Token 伪造是一种安全风险,攻击者可能会试图伪造 Token 以获得未经授权的访问权限。

解决方案

  1. 使用强密钥:使用强密钥确保 Token 的安全性。
  2. 限制 Token 有效期:设置合理的过期时间,减少 Token 的使用时间。
  3. 使用 HTTPS:使用 HTTPS 加密传输 Token,防止中间人攻击。

Token 过期策略

Token 过期是一种常见的现象,需要有合理的处理策略。

解决方案

  1. 自动刷新 Token:在 Token 接近过期时,客户端自动刷新 Token。
  2. 使用 Refresh Token:使用 Refresh Token 生成新的 Access Token。
  3. 用户重新登录:如果 Token 已过期,要求用户重新登录。
总结与后续学习方向

JWT 的优缺点

优点

  1. 无状态:JWT 是无状态的,不需要服务器存储状态信息。
  2. 安全性高:JWT 使用加密算法确保 Token 的安全。
  3. 紧凑性:JWT 的格式非常紧凑,便于传输和存储。

缺点

  1. 密钥管理:JWT 的安全性依赖于密钥的安全管理。
  2. 存储限制:JWT 的载荷大小有限制,不适合存储大量数据。
  3. 身份验证依赖:JWT 的安全性依赖于身份验证的正确性。

进阶学习资源推荐

  1. 慕课网慕课网 提供丰富的 JWT 相关课程,可以帮助你深入学习 JWT。
  2. 官方文档:阅读 JWT 的官方文档,了解其详细规范和最佳实践。
  3. 开源项目:研究开源项目中的 JWT 实现,了解实际应用中的细节。

通过以上学习,你将能够更好地理解和使用 JWT,为你的应用提供安全可靠的用户校验机制。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消