简介

从 Word 导入功能需要设置 JSON Web Token (JWT) 身份验证以确保文件安全性。JWT 端点会生成并提供授权令牌,用于验证提交的内容是由授权用户发送,从而防止未经授权的访问。作为标准的 Web 服务授权解决方案,JWT 的详细文档可在 https://jwt.io/ 查看。

本指南将全面介绍如何使用 Node.js 服务器生成 JWT 令牌,将 TinyMCE 与从 Word 导入功能集成,包括从 Word 导入功能的使用方法。内容涵盖项目设置、服务器配置以及 TinyMCE 的自定义。

您将构建的内容

在深入技术细节之前,以下是通过本指南您将实现的目标:

  • 一个运行从 Word 导入插件的可用 TinyMCE 编辑器

  • 一个使用 JWT 令牌的安全身份验证系统

  • 一个简单的 Node.js 服务器来处理身份验证

本指南专为初次接触 JWT 身份验证和 TinyMCE 集成的开发者设计。

前提条件

开始之前,请确保您具备以下条件:

  • 已安装 Node.js(可通过在终端运行 node -v 检查)

  • 一个 TinyMCE API 密钥(从 TinyMCE 网站获取)

  • 基本的命令行操作知识

请确保在开始前准备好您的 API 密钥。服务器和客户端配置都需要使用它。

快速入门指南

项目设置

# 创建并进入项目目录
mkdir tinymce-my-app
cd tinymce-my-app

# 初始化项目
npm init -y

# 安装所需包
npm install express cors jsonwebtoken

请确认 package.json 文件中已包含所需的依赖项。

创建项目结构

# 创建用于存放网页文件的 public 文件夹
mkdir public
touch public/index.html
touch jwt.js

您的项目结构应如下所示:

/tinymce-my-app
  /public
    index.html  (TinyMCE 网页)
  jwt.js        (服务器代码)
  package.json  (项目配置)

设置

生成公钥/私钥对

设置 JWT 身份验证

要为 TinyMCE 从 Word 导入功能设置 JSON Web Token (JWT) 身份验证:

  1. 在您的 Tiny 账户添加公钥,登录。

  2. 通过 Tiny 账户 - JWT 密钥 设置 JSON Web Token (JWT) 提供者端点

  3. 配置 TinyMCE 以使用 JWT 端点。

从 Word 导入服务器需要一个由将用于 JSON Web Token (JWT) 提供者端点的私钥生成的公钥。存储在从 Word 导入服务器中的公钥用于确保内容是由授权用户发送的。

在账户门户的 JWT 密钥部分,有两种生成并添加公钥的方法:

  1. 在 Tiny 账户 - JWT 密钥 页面生成新密钥对(推荐)。

  2. 在本地生成密钥对,并在 Tiny 账户 - JWT 密钥 导入公钥。

使用 Tiny 账户 JWT 密钥页面生成密钥对

Tiny 账户 - JWT 密钥页面提供“生成新密钥对”选项,这是一种快速且安全地生成所需密钥的方法。这将存储一份公钥的副本,并提供一个可下载的文件用于获取公钥和私钥。Tiny 不会存储私钥,且该密钥对之后无法找回。

在本地生成密钥对并添加到账户

此方法包括两个步骤:在本地生成密钥对,然后将公钥添加到账户门户。

在本地生成密钥对

在本地生成密钥对时,请使用支持的算法之一。从 Word 导入功能不支持对称加密算法,例如 HS256。Tiny 推荐使用 RS256 算法。支持的算法如下:

  • RS256

  • RS384

  • RS512

  • PS256

  • PS384

  • PS512

有关这些算法的详细信息,请访问:RFC 7518,JSON Web 算法 (JWA) 第 3 节 - 数字签名和 MAC 的加密算法。

有关在本地生成密钥对的说明,请参阅:为 Tiny Cloud 创建私钥/公钥对。

在账户门户的 JWT 密钥部分添加公钥

在本地生成公钥后,请使用账户门户 JWT 密钥部分的“导入公钥”选项:Tiny 账户 - JWT 密钥。

设置 JSON Web Token (JWT) 端点

JSON Web Token (JWT) 端点是一种为用户生成并提供授权令牌的服务。这些令牌可用于验证提交的内容是由授权用户发送的,并防止未经授权的访问。

下图展示了 JWT 的使用方式:

JSON Web Token 调用流程图 1. JSON Web Token 调用流程

当用户打开从 Word 导入功能时:

  1. 从 Word 导入功能会代表用户请求一个签名的 JWT。

  2. 如果你的 JWT endpoint 授权用户,你的 JWT endpoint 将发送一个 JWT 给 Import from Word,用于认证用户。

  3. 当用户发起请求(例如导入文档)时,JWT 将随请求一起发送,以表明该用户已获得授权。此 JWT 使用存储在 Import from Word Server 上的public密钥进行验证。

  4. Import from Word Server 发送响应,指示内容提交成功(如有必要,表示未授权)。

JWT endpoint 要求

Import from Word 的 JSON Web Token (JWT) endpoint 需要满足以下条件:

  • 该 endpoint 或服务器接受 JSON HTTP POST 请求。

  • 用户身份验证 - 一种验证用户身份并确认他们应有权访问 Import from Word 的方法。

  • 使用与提供给 Tiny Account - JWT Keys 的 public密钥配对的private密钥生成(签名)JWT。

  • 该 endpoint 或服务器生成包含 token 的 JSON 响应。Import from Word 会将该 token 随请求一起提交给 Import from Word Server。

Import from Word 所需的 JWT claims

JWT endpoint 生成的 JSON Web Tokens 必须包含以下 claims:

aud (必填)

类型:String

aud 是一个区分大小写的字符串,必须与已启用 Import from Word 插件的有效 API key 匹配。

iat (必填)

类型:Number

iat 表示签发时间戳,以秒数指定。例如,要将签发时间设置为当前时间戳,请将签发时间计算为当前时间戳除以 1000。

示例
iat: Math.floor(Date.now() / 1000), // 签发时间戳
exp (必填)

类型:Number

exp 表示过期时间戳,以秒数指定。例如,要设置 10 分钟的有效期,请将过期时间计算为当前时间戳加上 600 秒。

示例
exp: Math.floor(Date.now() / 1000) + (60 * 10) // 过期时间(10 分钟)

服务器设置 (jwt.js)

在根目录中,将服务器设置代码复制并粘贴到 jwt.js 文件中。

const express = require('express'); // 设置 Web 服务器。const jwt = require('jsonwebtoken'); // 生成并签名 JWT。const cors = require('cors'); // 允许跨域请求。const path = require('path'); // 处理文件路径。const app = express();app.use(cors());// 你的私钥(请用实际密钥替换此内容)const privateKey = `-----BEGIN PRIVATE KEY-----{Your private PKCS8 key goes here}-----END PRIVATE KEY-----`;app.use(express.static(path.join(__dirname, 'public')));// JWT token 生成 endpointapp.post('/jwt', (req, res) => { const payload = { aud: 'no-api-key', // 请用实际 API key 替换 iat: Math.floor(Date.now() / 1000), // 签发时间戳 exp: Math.floor(Date.now() / 1000) + (60 * 10) // 过期时间(10 分钟) }; try { // 使用 RS256 算法和你提供的私钥对 token 进行签名 const token = jwt.sign(payload, privateKey, { algorithm: 'RS256' }); res.json({ token }); } catch (error) { res.status(500).send('Failed to generate JWT token.'); console.error(error.message); }});const PORT = 3000;app.listen(PORT, () => { console.log(`Server running at http://localhost:${PORT}`);});

网页 (public/index.html)

在你创建了 index.html 文件的 public 文件夹内添加 HTML 设置代码。

<!DOCTYPE html>
<html>
<head>
  <title>TinyMCE with Import from Word</title>
  <script
    src="https://cdn.tiny.cloud/1/no-api-key/tinymce/8/tinymce.min.js"
    referrerpolicy="origin"
    crossorigin="anonymous">
  </script>
  <script>
    tinymce.init({
      selector: 'textarea',
      plugins: 'importword',
      toolbar: 'importword',
      importword_converter_options: {
        'formatting': {
          'styles': 'inline',
          'resets': 'inline',
          'defaults': 'inline',
        }
      },

      // importword_token_provider 从 `/jwt` endpoint 获取 token。
      importword_token_provider: () => {
        return fetch('http://localhost:3000/jwt', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
        }).then(response => response.json());
      },
    });
  </script>
</head>
<body>
  <h1>TinyMCE Import from Word Demo</h1>
  <textarea>
    Welcome to TinyMCE! Try the Import from Word feature.
  </textarea>
</body>
</html>

配置步骤

添加你的 API key

  • 将两个文件中的 no-api-key 替换为你实际的 TinyMCE API key

  • API key 在 HTML 脚本源和 JWT payload 中应保持一致

添加你的私钥

  • 将 jwt.js 中的私钥占位符替换为你实际的私钥

  • 确保其采用 PKCS8 格式

  • 请妥善保管此密钥,切勿公开分享

运行你的项目

  1. 启动服务器:

    node jwt.js
  2. 在浏览器中打开:http://localhost:3000

  3. 你应该会看到:

    • TinyMCE 编辑器

    • 工具栏中的“从 Word 导入”按钮