简介
Export to PDF 需要配置 JSON Web Token (JWT) 身份验证,以保持对文件安全性的控制。JWT 端点生成并提供授权令牌,用于验证提交的内容来自已授权用户,从而防止未经授权的访问。作为标准 Web 服务授权解决方案,JWT 的文档详见 https://jwt.io/。
本指南提供完整的操作步骤,说明如何通过使用 PHP 服务器生成 JWT 令牌,将 Export to PDF 功能与 TinyMCE 集成。内容包括项目设置、服务器配置和 TinyMCE 自定义。
您将构建什么
在深入技术细节之前,以下是通过本指南可以实现的目标:
一个正常运行的 TinyMCE 编辑器,运行 Export to PDF 插件
一个使用 JWT 令牌的安全身份验证系统
一个简单 PHP 服务器,用于处理身份验证
本指南面向初次接触 JWT 身份验证和 TinyMCE 集成的开发者。
先决条件
开始之前,请确保已满足以下条件:
计算机上已安装 PHP(可在终端中运行
php -v以检查)计算机上已安装 OpenSSL(可在终端中运行
openssl version以检查)计算机上已安装 Composer(可在终端中运行
composer -v以检查)拥有 TinyMCE API 密钥(可从 TinyMCE 官网获取)
基本熟悉命令行操作
请确保在开始之前准备好 API 密钥。服务器和客户端配置都需要此密钥。
本指南使用嵌套格式(
version: '2')编写exportpdf_converter_options。需要 TinyMCE 8.4.0 或更高版本。有关完整的选项文档,请参阅 Export to PDF。对于旧版本集成,请参阅 Export to PDF 的 JWT 身份验证设置(PHP)- 扁平格式。
更新 PHP 配置文件
使用以下命令定位 PHP 配置文件:
php --ini
在文本编辑器中打开配置文件并确保启用以下设置:
extension=openssl extension_dir='ext'
扩展目录的路径可能因系统而异。
快速入门指南
项目设置
# 创建并进入项目目录 mkdir tinymce-app cd tinymce-app # 初始化 Composer composer require firebase/php-jwt
创建项目结构
# 创建用于存放网页文件的 public 文件夹 touch index.html touch jwt.php
项目结构应如下所示:
/tinymce-app index.html (TinyMCE 网页) jwt.php (服务器代码) composer.json composer.lock vendor
配置
生成公钥/私钥对
设置 JWT 身份验证
要为 TinyMCE Export to PDF 配置 JSON Web Token (JWT) 身份验证:
将公钥添加到 Tiny 账户,登录。
通过 Tiny 账户 - JWT 密钥 设置 JSON Web Token (JWT) 提供程序端点
配置 TinyMCE 使用 JWT 端点。
Export to PDF 服务器要求使用由同一 私钥 生成的 公钥,该私钥将用于 JSON Web Token (JWT) 提供程序端点。存储在 Export to PDF 服务器上的公钥用于确保内容由授权用户发送。
在账户门户的 JWT 密钥部分,有两种生成和添加公钥的方法:
在 Tiny 账户 - JWT 密钥 页面生成新密钥对(推荐)。
在本地生成密钥对并在 Tiny 账户 - JWT 密钥 页面导入公钥。
使用 Tiny 账户 JWT 密钥页面生成密钥对
Tiny 账户 - JWT 密钥 页面提供“Generate New Keypair”选项,可快速安全地生成所需密钥。此操作会存储一份 公钥 副本,并提供一个可下载的文件,其中包含公钥和私钥。Tiny 不存储 私钥,该密钥对无法以后检索。
在本地生成密钥对并添加到账户
此方法包括两个步骤:在本地生成密钥对,然后将公钥添加到账户门户。
在本地生成密钥对
在本地生成密钥对时,请使用一种支持的算法。Export to PDF 不支持对称加密算法,例如 HS256。Tiny 建议使用 RS256 算法。支持以下算法:
RS256
RS384
RS512
PS256
PS384
PS512
有关这些算法的详细信息,请访问:RFC 7518, JSON Web Algorithms (JWA) Section 3 - 数字签名和 MAC 的加密算法。
有关在本地生成密钥对的说明,请参阅:为 Tiny Cloud 创建私钥/公钥对。
在账户门户的 JWT Keys 部分添加公钥
在本地生成公钥后,使用位于以下地址的账户门户中 JWT Keys 部分的 “Import Public Key” 选项:Tiny Account - JWT Keys。
设置 JSON Web Token (JWT) 端点
JSON Web Token (JWT) 端点是用于生成并向用户提供授权令牌的服务。这些令牌随后可用于验证所提交的内容是否由授权用户发送,并防止未经授权的访问。
下图展示了 JWT 的使用方式:
当用户打开 Export to PDF 时:
Export to PDF 代表用户请求一个已签名的 JWT。
如果 JWT 端点授权该用户,JWT 端点将向 Export to PDF 发送一个 JWT,以认证该用户。
当用户发出请求(例如导出文档)时,该 JWT 将随请求一起发送,以表明该用户已获得授权。此 JWT 使用存储在 Export to PDF Server 上的 public 密钥进行验证。
Export to PDF Server 发送响应,表明内容提交成功(或在必要时提示未授权)。
JWT 端点要求
Export to PDF 的 JSON Web Token (JWT) 端点需要满足以下条件:
端点或服务器接受 JSON HTTP POST 请求。
用户身份验证 —— 一种验证用户身份并确认其应有权访问 Export to PDF 的方法。
JWT 使用与提供给 Tiny Account - JWT Keys 的 public 密钥配对的 private 密钥生成(签名)。
端点或服务器生成包含令牌的 JSON 响应。Export to PDF 将在向 Export to PDF Server 发出的请求中提交该令牌。
Export to PDF 所需的 JWT 声明
JWT 端点生成的 JSON Web Tokens 必须包含以下声明:
aud (required)Type: String
aud 是区分大小写的字符串,必须与已启用 Export to PDF 插件的有效 API 密钥匹配。
iat (required)Type: Number
iat 表示签发时间戳,以秒数为单位指定。例如,要将签发时间设置为当前时间戳,可将签发时间计算为当前时间戳除以 1000。
iat: Math.floor(Date.now() / 1000), // 签发时间戳
exp (required)Type: Number
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>TinyMCE 导出为 PDF</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: 'exportpdf',
toolbar: 'exportpdf',
exportpdf_converter_options: {
version: '2',
document: {
size: 'Letter',
margins: {
top: '1in',
right: '1in',
bottom: '1in',
left: '1in'
}
}
},
// exportpdf_token_provider 从 `/jwt.php` 端点获取 token。
exportpdf_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 导出为 PDF 演示</h1>
<textarea>
欢迎使用 TinyMCE!尝试导出为 PDF 功能。
</textarea>
</body>
</html>配置步骤
添加您的 API Key
将两个文件中的
no-api-key替换为您的实际 TinyMCE API keyAPI key 在 HTML script source 和 JWT payload 中应该相同
添加您的私钥
将
jwt.php中的私钥占位符替换为您的实际私钥确保它是
PKCS8格式保持此密钥安全,切勿公开分享
运行您的项目
启动服务器:
php -S localhost:3000
在浏览器中打开:
http://localhost:3000您应该看到:
TinyMCE 编辑器
工具栏中的“导出为 PDF”按钮
进一步配置
有关其他选项,如每页页眉和页脚、PDF 元数据和安全设置,请参阅 Export to PDF 插件页面上的 exportpdf_converter_options 部分。