JWT编码/解码核心JS实现

简介: 本文介绍基于 Vue 3/Nuxt 3 实现的纯前端 JWT 编码/解码工具,支持 HS/RS/PS/ES 等主流算法。核心库 `JWTHelper` 封装 Base64 URL 编解码、JWT 解析、签名生成与验证,HMAC 用 CryptoJS,RSA/ECDSA 等非对称算法调用 Web Crypto API,全程浏览器端完成,安全高效。

JWT编码/解码核心JS实现

本文将介绍基于 Vue 3 和 Nuxt 3 实现的"JWT编码/解码"工具的核心技术方案。该工具主要用于在浏览器端对 JWT(JSON Web Token)进行编码、解码和签名验证,所有处理均在前端完成。

在线工具网址:https://see-tool.com/jwt-encryptor
工具截图:
在这里插入图片描述

1. 核心库设计

我们将核心的 JWT 处理逻辑封装在一个独立的 JS 库中,采用 IIFE 模式导出到全局 window.JWTHelper

1.1 Base64 URL 编码/解码

JWT 使用 Base64 URL 安全编码,需要将标准 Base64 的 + 替换为 -/ 替换为 _,并移除填充字符 =

base64UrlEncode(str) {
   
    const base64 = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str));
    return base64
        .replace(/\+/g, '-')
        .replace(/\//g, '_')
        .replace(/=/g, '');
}

base64UrlDecode(str) {
   
    let base64 = str.replace(/-/g, '+').replace(/_/g, '/');
    while (base64.length % 4) {
   
        base64 += '=';
    }

    try {
   
        return CryptoJS.enc.Base64.parse(base64).toString(CryptoJS.enc.Utf8);
    } catch (error) {
   
        throw new Error('Invalid Base64 URL encoding');
    }
}

1.2 JWT 解码

将 JWT token 按点号分割成三部分,分别解码 Header、Payload 和 Signature。

decode(token) {
   
    if (!token || typeof token !== 'string') {
   
        throw new Error('Invalid token');
    }

    const parts = token.split('.');
    if (parts.length !== 3) {
   
        throw new Error('Invalid JWT format. Expected 3 parts separated by dots');
    }

    try {
   
        const header = JSON.parse(this.base64UrlDecode(parts[0]));
        const payload = JSON.parse(this.base64UrlDecode(parts[1]));
        const signature = parts[2];

        return {
   
            header,
            payload,
            signature
        };
    } catch (error) {
   
        throw new Error('Failed to decode JWT: ' + error.message);
    }
}

1.3 签名创建

支持多种算法:HMAC(HS256/384/512)、RSA PKCS#1 v1.5(RS256/384/512)、RSA-PSS(PS256/384/512)、ECDSA(ES256/384/512)。

createSignature(header, payload, secret, algorithm = 'HS256') {
   
    const data = header + '.' + payload;
    const alg = algorithm.toUpperCase();

    if (alg.startsWith('HS')) {
   
        let hash;
        switch (alg) {
   
            case 'HS256':
                hash = CryptoJS.HmacSHA256(data, secret);
                break;
            case 'HS384':
                hash = CryptoJS.HmacSHA384(data, secret);
                break;
            case 'HS512':
                hash = CryptoJS.HmacSHA512(data, secret);
                break;
            default:
                throw new Error('Unsupported HMAC algorithm: ' + algorithm);
        }
        return CryptoJS.enc.Base64.stringify(hash)
            .replace(/\+/g, '-')
            .replace(/\//g, '_')
            .replace(/=/g, '');
    }

    if (alg.startsWith('RS')) {
   
        return this.createRSASignature(data, secret, alg);
    }

    if (alg.startsWith('PS')) {
   
        return this.createPSSSignature(data, secret, alg);
    }

    if (alg.startsWith('ES')) {
   
        return this.createECDSASignature(data, secret, alg);
    }

    throw new Error('Unsupported algorithm: ' + algorithm);
}

1.4 RSA 签名实现

使用 Web Crypto API 处理非对称加密算法,先将 PEM 格式的私钥导入,然后进行签名。

async createRSASignature(data, privateKeyPem, algorithm) {
   
    try {
   
        const privateKey = await this.importRSAPrivateKey(privateKeyPem);

        let hashAlg;
        switch (algorithm) {
   
            case 'RS256':
                hashAlg = 'SHA-256';
                break;
            case 'RS384':
                hashAlg = 'SHA-384';
                break;
            case 'RS512':
                hashAlg = 'SHA-512';
                break;
            default:
                throw new Error('Unsupported RSA algorithm: ' + algorithm);
        }

        const encoder = new TextEncoder();
        const dataBuffer = encoder.encode(data);
        const signatureBuffer = await crypto.subtle.sign(
            {
   
                name: 'RSASSA-PKCS1-v1_5',
                hash: {
    name: hashAlg }
            },
            privateKey,
            dataBuffer
        );

        const signatureArray = new Uint8Array(signatureBuffer);
        const signatureBase64 = btoa(String.fromCharCode.apply(null, signatureArray));
        return signatureBase64
            .replace(/\+/g, '-')
            .replace(/\//g, '_')
            .replace(/=/g, '');
    } catch (error) {
   
        throw new Error('RSA signature failed: ' + error.message);
    }
}

1.5 密钥导入

将 PEM 格式的密钥转换为 Web Crypto API 可用的 CryptoKey 对象。

async importRSAPrivateKey(pem) {
   
    const pemContents = pem
        .replace(/-----BEGIN (RSA )?PRIVATE KEY-----/, '')
        .replace(/-----END (RSA )?PRIVATE KEY-----/, '')
        .replace(/\s/g, '');

    const binaryDer = atob(pemContents);
    const binaryDerBuffer = new Uint8Array(binaryDer.length);
    for (let i = 0; i < binaryDer.length; i++) {
   
        binaryDerBuffer[i] = binaryDer.charCodeAt(i);
    }

    return await crypto.subtle.importKey(
        'pkcs8',
        binaryDerBuffer,
        {
   
            name: 'RSASSA-PKCS1-v1_5',
            hash: {
    name: 'SHA-256' }
        },
        false,
        ['sign']
    );
}

1.6 JWT 编码

将 Header、Payload 编码后创建签名,组合成完整的 JWT token。

async encode(payload, secret, algorithm = 'HS256') {
   
    if (!secret) {
   
        throw new Error('Secret key is required');
    }

    if (typeof payload !== 'object' || payload === null) {
   
        throw new Error('Payload must be an object');
    }

    const header = {
   
        alg: algorithm.toUpperCase(),
        typ: 'JWT'
    };

    const encodedHeader = this.base64UrlEncode(JSON.stringify(header));
    const encodedPayload = this.base64UrlEncode(JSON.stringify(payload));

    const signature = await this.createSignature(encodedHeader, encodedPayload, secret, algorithm);

    return encodedHeader + '.' + encodedPayload + '.' + signature;
}

1.7 签名验证

验证 JWT 签名的有效性,支持所有算法类型。

async verify(token, secret) {
   
    if (!token || !secret) {
   
        return false;
    }

    try {
   
        const parts = token.split('.');
        if (parts.length !== 3) {
   
            return false;
        }

        const header = JSON.parse(this.base64UrlDecode(parts[0]));
        const algorithm = header.alg;
        const data = parts[0] + '.' + parts[1];

        if (algorithm.startsWith('RS')) {
   
            return await this.verifyRSASignature(data, parts[2], secret, algorithm);
        }

        if (algorithm.startsWith('PS')) {
   
            return await this.verifyPSSSignature(data, parts[2], secret, algorithm);
        }

        if (algorithm.startsWith('ES')) {
   
            return await this.verifyECDSASignature(data, parts[2], secret, algorithm);
        }

        const expectedSignature = this.createSignature(parts[0], parts[1], secret, algorithm);
        return parts[2] === expectedSignature;
    } catch (error) {
   
        console.error('Verification error:', error);
        return false;
    }
}

2. Vue 组件集成

在 Vue 组件中,通过动态脚本加载核心库和 crypto-js,然后使用 window.JWTHelper 进行编码和解码操作。

const decodeJWT = async () => {
   
    const token = jwtInput.value.trim()
    if (!token) {
   
        headerOutput.value = ''
        payloadOutput.value = ''
        signatureOutput.value = ''
        signatureStatus.value = ''
        return
    }
    try {
   
        const decoded = jwtHelper.decode(token)
        headerOutput.value = formatJSON(decoded.header)
        payloadOutput.value = formatJSON(decoded.payload)
        signatureOutput.value = decoded.signature

        if (verifySignature.value && secretKey.value) {
   
            const isValid = await jwtHelper.verify(token, secretKey.value)
            signatureStatus.value = isValid ? 'valid' : 'invalid'
        } else {
   
            signatureStatus.value = ''
        }
    } catch (error) {
   
        headerOutput.value = error.message
        payloadOutput.value = ''
        signatureOutput.value = ''
        signatureStatus.value = ''
    }
}

const encodeJWT = async () => {
   
    try {
   
        const payload = JSON.parse(payloadInput.value || '{}')
        const token = await jwtHelper.encode(payload, secretKey.value, encodeAlgorithm.value)
        jwtOutput.value = token
    } catch (error) {
   
        jwtOutput.value = error.message
    }
}

总结

该方案的核心在于通过 jwt-helper.js 封装纯粹的 JWT 处理逻辑,结合 CryptoJS 处理 HMAC 算法,利用 Web Crypto API 处理非对称加密算法(RSA、ECDSA),实现了一个功能完善的纯前端 JWT 编码/解码工具。

相关文章
|
19天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
32068 116
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
8天前
|
应用服务中间件 API 网络安全
3分钟汉化OpenClaw,使用Docker快速部署启动OpenClaw(Clawdbot)教程
2026年全新推出的OpenClaw汉化版,是基于Claude API开发的智能对话系统本土化优化版本,解决了原版英文界面的使用壁垒,实现了界面、文档、指令的全中文适配。该版本采用Docker容器化部署方案,开箱即用,支持Linux、macOS、Windows全平台运行,适配个人、企业、生产等多种使用场景,同时具备灵活的配置选项和强大的扩展能力。本文将从项目简介、部署前准备、快速部署、详细配置、问题排查、监控维护等方面,提供完整的部署与使用指南,文中包含实操代码命令,确保不同技术水平的用户都能快速落地使用。
4700 4
|
14天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
6759 18
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
13天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
4750 11
|
16天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
5650 20
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
12天前
|
人工智能 JavaScript 安全
Claude Code 安装指南
Claude Code 是 Anthropic 推出的本地 AI 编程助手,支持 Mac/Linux/WSL/Windows 多平台一键安装(Shell/PowerShell/Homebrew/NPM),提供 CLI 交互、代码生成、审查、Git 提交等能力,并内置丰富斜杠命令与自动更新机制。
4165 0
|
15天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
6202 5
|
17天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
7753 17