简介
导出为 PDF 需要设置 JSON Web Token (JWT) 身份验证,以确保对文件安全性的控制。JWT 端点会生成并提供授权令牌,用于验证提交的内容来自授权用户,从而防止未经授权的访问。作为标准的 Web 服务授权解决方案,JWT 在 https://jwt.io/ 有详细的文档说明。
本指南提供了将导出为 PDF 与 TinyMCE 集成的全面教程,包括导出为 PDF 功能,并通过使用 PHP 服务器生成 JWT 令牌来实现。内容涵盖项目设置、服务器配置和 TinyMCE 定制。
您将构建的内容
在深入探讨技术细节之前,以下是通过本指南您将实现的内容:
一个运行导出为 PDF 插件的可用 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 导出为 PDF 设置 JSON Web Token (JWT) 身份验证:
将公钥添加到您的 Tiny 账户,登录。
通过 Tiny 账户 - JWT 密钥设置 JSON Web Token (JWT) 提供者端点
配置您的 TinyMCE 以使用 JWT 端点。
导出为 PDF 服务器需要一个由用于 JSON Web Token (JWT) 提供者端点的同一私钥生成的公钥。存储在导出为 PDF 服务器上的公钥用于确保内容来自授权用户。
在账户门户的 JWT 密钥部分,有两种生成和添加公钥的方法:
在 Tiny 账户 - JWT 密钥生成新的密钥对(推荐)。
在本地生成密钥对,并在 Tiny 账户 - JWT 密钥导入公钥。
使用 Tiny 账户 JWT 密钥页面生成密钥对
Tiny 账户 - JWT 密钥页面提供了一个“生成新密钥对”选项,提供了一种快速且安全的方法来生成所需的密钥。这将存储一份公钥,并提供一个包含公钥和私钥的可下载文件。Tiny 不会存储私钥,并且之后无法检索该密钥对。
在本地生成密钥对并将其添加到账户
这种方法包括两个步骤:在本地生成密钥对,然后将公钥添加到账户门户。
在本地生成密钥对
在本地生成密钥对时,请使用支持的算法之一。导出为 PDF 不支持对称加密算法,例如 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) endpoint 是一个为用户生成并提供授权令牌的服务。这些令牌随后可用于验证提交的内容是否由授权用户发送,并防止未授权访问。
下图展示了 JWT 的使用方式:
当用户打开 Export to PDF 时:
Export to PDF 代表用户请求一个签名的 JWT。
如果 JWT endpoint 授权该用户,JWT endpoint 将向 Export to PDF 发送一个 JWT,证明该用户已通过认证。
当用户发出请求(例如导出文档)时,JWT 将随请求一起发送,以表明该用户已获得授权。此 JWT 使用存储在 Export to PDF Server 上的公钥进行验证。
Export to PDF Server 发送响应,指示内容提交成功(必要时指示未授权)。
JWT endpoint 要求
Export to PDF 的 JSON Web Token (JWT) endpoint 需要:
endpoint 或服务器接受 JSON HTTP POST 请求。
用户认证 - 一种验证用户身份并确认其应具有 Export to PDF 访问权限的方法。
JWT 使用与提供给 Tiny Account - JWT Keys 的公钥配对的私钥生成(签名)。
endpoint 或服务器生成包含令牌的 JSON 响应。Export to PDF 将随请求一起向 Export to PDF Server 提交该令牌。
Export to PDF 所需的 JWT 声明
JWT endpoint 生成的 JSON Web Token 必须包含以下声明:
aud (必需)类型:String
aud 是一个区分大小写的字符串,必须与启用了 Export to PDF 插件的有效 API 密钥匹配。
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.php)
在根目录中,将服务器设置代码复制并粘贴到 jwt.php 文件中。
<?php
require 'vendor/autoload.php'; // 设置 Autoload
use \Firebase\JWT\JWT;
function fatalError($message) {
http_response_code(500);
header('Content-Type: application/json');
die(json_encode(array("message" => "JWT auth failed: " . $message)));
}
// 检查 OpenSSL 扩展
if (!extension_loaded('openssl')) {
fatalError('You need to enable the openssl extension in your php.ini.');
}
// 启用 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-----
{Your private PKCS8 key goes here}
-----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 with PDF Export</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: {
'format': 'Letter',
'margin_top': '1in',
'margin_right': '1in',
'margin_bottom': '1in',
'margin_left': '1in'
},
// exportpdf_token_provider 从 `/jwt.php` endpoint 获取令牌。
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 Export to PDF Demo</h1>
<textarea>
Welcome to TinyMCE! Try the Export to PDF feature.
</textarea>
</body>
</html>配置步骤
添加您的 API 密钥
将两个文件中的
no-api-key替换为您的实际 TinyMCE API 密钥API 密钥在 HTML script 源和 JWT 负载中应该相同
添加您的私钥
将
jwt.php中的私钥占位符替换为您的实际私钥确保它采用
PKCS8格式妥善保管此密钥,切勿公开分享
运行项目
启动服务器:
php -S localhost:3000
在浏览器中打开:
http://localhost:3000您应该会看到:
TinyMCE 编辑器
工具栏中的“导出为 PDF”按钮