简介
“从 Word 导入”功能需要设置 JSON Web Token (JWT) 认证,以保持对文件安全性的控制。JWT 端点生成并提供授权令牌,用于验证提交的内容由授权用户发送,防止未授权访问。作为标准的 Web 服务授权解决方案,JWT 的文档可在 https://jwt.io/ 上找到。
本指南提供了将“从 Word 导入”功能与 TinyMCE 集成的全面操作步骤,包括“从 Word 导入”功能,通过使用 PHP 服务器生成 JWT 令牌。它涵盖了项目设置、服务器配置和 TinyMCE 自定义。
您将构建的内容
在深入技术细节之前,以下是您通过本指南将实现的内容:
一个运行“从 Word 导入”插件的可用 TinyMCE 编辑器
一个使用 JWT 令牌的安全认证系统
一个简单的 PHP 服务器来处理认证
本指南专为刚开始接触 JWT 认证和 TinyMCE 集成的开发人员设计。
前提条件
开始之前,请确保您已经:
在您的计算机上安装了 PHP(检查方法是在终端中运行
php -v)在您的计算机上安装了 OpenSSL(检查方法是在终端中运行
openssl version)在您的计算机上安装了 Composer(检查方法是在终端中运行
composer -v)拥有一个 TinyMCE API 密钥(从 TinyMCE 的网站获取)
对命令行有基本的了解
在开始之前,请确保您已经准备好 API 密钥。您将在服务器和客户端配置中都需要用到它。
更新 PHP 配置文件
使用以下命令查找 PHP 配置文件:
php --ini
在文本编辑器中打开配置文件,并确保启用了以下设置:
extension=openssl extension_dir='ext'
扩展目录的路径可能因您的系统而异。
快速入门指南
项目设置
# 创建并进入项目目录 mkdir tinymce-app cd tinymce-app # 初始化 Composer composer require firebase/php-jwt
创建项目结构
# 为 Web 文件创建 public 文件夹 touch index.html touch jwt.php
您的项目应该如下所示:
/tinymce-app index.html (TinyMCE 网页) jwt.php (服务器代码) composer.json composer.lock vendor
设置
生成公钥/私钥对
设置 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 端点授权该用户,端点将向“从 Word 导入”功能发送一个 JWT,以证明该用户已获得授权。
当用户发起请求(例如导入文档)时,JWT 会随请求一起发送,以表明该用户已获得授权。此 JWT 将通过存储在“从 Word 导入”服务器上的公钥进行验证。
“从 Word 导入”服务器会发送响应,表示内容提交成功(或在必要时返回未授权信息)。
JWT 端点要求
用于“从 Word 导入”功能的 JSON Web Token(JWT)端点需要满足以下条件:
端点或服务器需接受 JSON HTTP POST 请求。
用户身份验证 - 必须有一种方法来验证用户身份,并确认其应具有对“从 Word 导入”功能的访问权限。
JWT 必须使用与提供给 Tiny 账户 - JWT 密钥的公钥配对的私钥进行签名生成。
端点或服务器需生成包含令牌的 JSON 响应。“从 Word 导入”功能会将该令牌随请求一起提交给“从 Word 导入”服务器。
“从 Word 导入”功能所需的 JWT 声明
JWT 端点生成的 JSON Web Token 必须包含以下声明:
aud (必选)类型:字符串
aud 是一个大小写敏感的字符串,必须与已启用“从 Word 导入”插件的有效 API 密钥匹配。
iat (必选)类型:数字
iat 表示签发时间戳,以秒为单位指定。例如,若要将签发时间设置为当前时间戳,可将签发时间计算为当前时间戳除以 1000。
iat: Math.floor(Date.now() / 1000), // 签发时间戳
exp (必选)类型:数字
exp 表示过期时间戳,以秒为单位指定。例如,若要设置 10 分钟的有效期,可将过期时间计算为当前时间戳加 600 秒。
exp: Math.floor(Date.now() / 1000) + (60 * 10) // 过期时间(10 分钟)
服务器设置(jwt.php)
在根目录中,将服务器设置代码复制并粘贴到 jwt.php 文件中。
<?php
require 'vendor/autoload.php'; // 设置自动加载
use \Firebase\JWT\JWT;
function fatalError($message) {
http_response_code(500);
header('Content-Type: application/json');
die(json_encode(array("message" => "JWT 认证失败:" . $message)));
}
// 检查 OpenSSL 扩展
if (!extension_loaded('openssl')) {
fatalError('您需要在 php.ini 中启用 openssl 扩展。');
}
// 启用 CORS
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
// JWT 有效负载
$payload = array(
"aud" => "no-api-key",
"iat" => time(), // 签发时间戳
"exp" => time() + 60 * 10 // 过期时间(10 分钟)
);
try {
// 令牌使用您的私钥通过 RS256 算法签名
$privateKey = <<<EOD
-----BEGIN PRIVATE KEY-----
{您的 PKCS8 私钥放在这里}
-----END PRIVATE KEY-----
EOD;
$token = JWT::encode($payload, $privateKey, 'RS256');
http_response_code(200);
header('Content-Type: application/json');
echo json_encode(array("token" => $token));
} catch (Exception $e) {
fatalError($e->getMessage());
}
?>网页设置(index.html)
在您创建 index.html 文件的 public 文件夹内,添加 HTML 设置代码。
<!DOCTYPE html>
<html>
<head>
<title>带 Word 导入功能的 TinyMCE</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: {
'format': 'Letter',
'margin_top': '1in',
'margin_right': '1in',
'margin_bottom': '1in',
'margin_left': '1in'
},
// importword_token_provider 从 `/jwt.php` 端点获取令牌。
importword_token_provider: () => {
return fetch('http://localhost:3000/jwt.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
}).then(response => response.json());
},
});
</script>
</head>
<body>
<h1>TinyMCE Word 导入演示</h1>
<textarea>
欢迎使用 TinyMCE!尝试使用“从 Word 导入”功能。
</textarea>
</body>
</html>配置步骤
添加您的 API 密钥
将两个文件中的
no-api-key替换为您实际的 TinyMCE API 密钥。API 密钥在 HTML 脚本源和 JWT 有效负载中应保持一致。
添加您的私钥
将
jwt.php中的私钥占位符替换为您的实际私钥确保它是
PKCS8格式保持此密钥安全,切勿公开分享
运行您的项目
启动服务器:
php -S localhost:3000
在浏览器中打开:
http://localhost:3000您应该会看到:
TinyMCE 编辑器
工具栏中的“从 Word 导入”按钮