介绍
Tiny Drive 需要您设置 JSON Web Token (JWT) 身份验证。这是为了确保您的文件安全仍然由您掌控。
JSON Web Token (JWT) 端点是一个用于为用户生成和提供授权令牌的服务。这些令牌随后可用于验证提交的内容是由授权用户发送的,并防止未经授权的访问。
JWT 是 Web 服务的标准授权解决方案,更多详细信息可在 https://jwt.io/ 网站上找到。本指南旨在展示如何为 Tiny Drive 设置 JWT 身份验证。
如果您还没有尝试过任何 入门项目,我们建议您在尝试实现自己的解决方案之前先尝试这些项目。源代码也可在 Github 上查看。
概述
为 Tiny Drive 设置 JWT 身份验证
在您的账户门户的 JWT 密钥部分添加公钥
设置 JSON Web Token (JWT) 端点
JWT 端点示例
为 Tiny Drive 设置 JWT 身份验证
要为 TinyMCE Tiny Drive 设置 JSON Web Token (JWT) 身份验证:
将公钥添加到您的 Tiny 账户。
设置 JSON Web Token (JWT) 提供者端点。
配置 TinyMCE 以使用 JWT 端点。
Tiny Drive 服务器需要一个由 私钥 生成的 公钥,该 私钥 将用于 JSON Web Token (JWT) 提供者端点。存储在 Tiny Drive 服务器上的公钥用于确保内容是由授权用户发送的。
在账户门户的 JWT 密钥部分生成并添加公钥有两种方法:
在 Tiny Account - JWT Keys 页面生成新的密钥对(推荐)。
在本地生成密钥对,并在 Tiny Account - JWT Keys 页面导入公钥。
使用 Tiny Account JWT Keys 页面生成密钥对
Tiny Account - JWT Keys 页面提供了一个“Generate New Keypair”选项,提供了一种快速且安全的方法来生成所需的密钥。这将存储一份 公钥 的副本,并提供一个可下载的文件,包含公钥和私钥。Tiny 不存储 私钥,并且该密钥对之后无法检索。
在本地生成密钥对并将其添加到账户中
此方法涉及两个步骤:在本地生成密钥对,然后将公钥添加到账户门户。
在本地生成密钥对
在本地生成密钥对时,请使用支持的算法之一。Tiny Drive 不支持对称加密算法,如 HS256。Tiny 建议使用 RS256 算法。以下算法受支持:
RS256
RS384
RS512
PS256
PS384
PS512
有关这些算法的详细信息,请访问:RFC 7518, JSON Web Algorithms (JWA) Section 3 - Cryptographic Algorithms for Digital Signatures and MACs。
有关在本地生成密钥对的说明,请参阅:Creating a private/public key pair for Tiny Cloud。
在账户门户的 JWT 密钥部分添加公钥
一旦在本地生成了公钥,请使用以下位置的账户门户 JWT 密钥部分的“Import Public Key”选项:Tiny Account - JWT Keys。
设置 JSON Web Token (JWT) 端点
JSON Web Token (JWT) 端点是一个用于为用户生成和提供授权令牌的服务。这些令牌随后可用于验证提交的内容是由授权用户发送的,并防止未经授权的访问。
下图展示了 JWT 的使用方式:
当用户打开 Tiny Drive 时:
Tiny Drive 代表用户请求一个签名的 JWT。
如果您的 JWT 端点授权该用户,您的 JWT 端点将向 Tiny Drive 发送一个 JWT,以认证该用户。
当用户发出请求(如添加或删除文件)时,JWT 将随请求一起发送,以表明该用户已获得授权。此 JWT 使用存储在 Tiny Cloud 服务器上的 公钥 进行验证。
Tiny Cloud 服务器发送响应,指示内容提交成功(或必要时未授权)。
JWT 端点要求
Tiny Drive 的 JSON Web Token (JWT) 端点需要满足以下条件:
端点或服务器接受 JSON HTTP POST 请求。
用户身份验证 - 一种验证用户并确认其应有权访问 Tiny Drive 的方法。
使用与提供给 Tiny Account - JWT Keys 的 公钥 配对的 私钥 生成(签名)JWT。
端点或服务器生成包含令牌的 JSON 响应。Tiny Drive 将向 Tiny Drive 服务器发送带有令牌的请求。
Tiny Drive 所需的 JWT 声明
JWT 端点生成的 JSON Web Token 必须包含以下声明:
sub (必需)类型: String 或 URI
用于识别用户的唯一字符串或URI。可以是数据库ID、经过哈希处理的电子邮件地址,或类似的标识符。
name (必需)类型: String
用户的全名,用于在Tiny Drive中进行展示。当用户上传文件时,该名称将作为文件创建者显示。
https://claims.tiny.cloud/drive/root (可选)类型: String
Tiny Drive特定的根目录完整路径,例如“/johndoe”。用户将无法查看或管理此配置的根路径之外的文件。
“sub”声明是一个区分大小写的字符串,包含一个String或URI值。sub声明不能包含:,除非它是一个有效的URI,否则回调将失败。
JWT端点示例
以下示例展示了一个最小的JWT端点,以及如何配置TinyMCE来使用它们。
PHP令牌提供者端点示例
Node.js令牌提供者端点示例
PHP令牌提供者端点示例
此示例使用通过Composer依赖管理器提供的Firebase JWT库。
$privateKey应是与在Tiny Account - JWT Keys生成(或提供)的公钥配对的私钥。
jwt.php
<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
$privateKey = <<<EOD
-----BEGIN PRIVATE KEY-----
....
-----END PRIVATE KEY-----
EOD;
// 注意:在继续处理令牌之前,请验证用户会话或访问权限。
$payload = array(
"sub" => "123", // 唯一用户ID字符串
"name" => "John Doe", // 用户的全名
// 可选的自定义用户根路径
// "https://claims.tiny.cloud/drive/root" => "/johndoe",
"exp" => time() + 60 * 10 // 10分钟过期时间
);
try {
$token = JWT::encode($payload, $privateKey, 'RS256');
http_response_code(200);
header('Content-Type: application/json');
echo json_encode(array("token" => $token));
} catch (Exception $e) {
http_response_code(500);
header('Content-Type: application/json');
echo $e->getMessage();
}
?>使用jwt.php端点的TinyMCE示例
tinymce.init({
selector: 'textarea',
plugins: 'image media link tinydrive code editimage',
tinydrive_token_provider: 'jwt.php',
toolbar: 'insertfile image link | code'
});Node.js令牌提供者端点示例
此示例展示了如何设置一个生成令牌的Node.js express处理器。它需要您安装Express Web框架和jsonwebtoken Node模块。有关设置基本的Node.js Express服务器并添加TinyMCE的说明,请参阅:将TinyMCE集成到Express JS应用程序中。
privateKey应是与在Tiny Account - JWT Keys生成(或提供)的公钥配对的私钥。
/jwt
const express = require('express');
const jwt = require('jsonwebtoken');
const cors = require('cors');
const app = express();
app.use(cors());
const privateKey = `
-----BEGIN PRIVATE KEY-----
....
-----END PRIVATE KEY-----
`;
app.post('/jwt', (req, res) => {
// 注意:在继续处理令牌之前,请验证用户会话或访问权限。
const payload = {
sub: '123', // 唯一用户ID字符串
name: 'John Doe', // 用户的全名
// 可选的自定义用户根路径
// 'https://claims.tiny.cloud/drive/root': '/johndoe',
exp: Math.floor(Date.now() / 1000) + (60 * 10) // 10分钟过期时间
};
try {
const token = jwt.sign(payload, privateKey, { algorithm: 'RS256'});
res.set('content-type', 'application/json');
res.status(200);
res.send(JSON.stringify({
token: token
}));
} catch (e) {
res.status(500);
res.send(e.message);
}
});
app.listen(3000);使用/jwt端点的TinyMCE示例
tinymce.init({
selector: 'textarea',
plugins: 'image media link tinydrive code editimage',
tinydrive_token_provider: '/jwt',
toolbar: 'insertfile image link | code'
});