简介
从 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) 身份验证:
在您的 Tiny 账户添加公钥,登录。
通过 Tiny 账户 - JWT 密钥 设置 JSON Web Token (JWT) 提供者端点
配置 TinyMCE 以使用 JWT 端点。
从 Word 导入服务器需要一个由将用于 JSON Web Token (JWT) 提供者端点的私钥生成的公钥。存储在从 Word 导入服务器中的公钥用于确保内容是由授权用户发送的。
在账户门户的 JWT 密钥部分,有两种生成并添加公钥的方法:
在 Tiny 账户 - JWT 密钥 页面生成新密钥对(推荐)。
在本地生成密钥对,并在 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 的使用方式:
当用户打开从 Word 导入功能时:
从 Word 导入功能会代表用户请求一个签名的 JWT。
如果你的 JWT endpoint 授权用户,你的 JWT endpoint 将发送一个 JWT 给 Import from Word,用于认证用户。
当用户发起请求(例如导入文档)时,JWT 将随请求一起发送,以表明该用户已获得授权。此 JWT 使用存储在 Import from Word Server 上的public密钥进行验证。
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 keyAPI key 在 HTML 脚本源和 JWT payload 中应保持一致
添加你的私钥
将
jwt.js中的私钥占位符替换为你实际的私钥确保其采用
PKCS8格式请妥善保管此密钥,切勿公开分享
运行你的项目
启动服务器:
node jwt.js
在浏览器中打开:
http://localhost:3000你应该会看到:
TinyMCE 编辑器
工具栏中的“从 Word 导入”按钮