签名
ONLYOFFICE 文档使用令牌,这些令牌是使用 JSON Web Tokens 标准生成的。当执行客户端浏览器请求到 ONLYOFFICE 文档,或与 ONLYOFFICE 文档 之间进行 HTTP 请求时,会发送这些令牌。
信息
此功能从 ONLYOFFICE 文档 4.2 版本开始使用。
对于验证设置,需要编辑位于配置文件中的 secret key 和 token参数,配置文件可在以下路径找到(或创建):
- Linux
- Windows
/etc/onlyoffice/documentserver/local.json
%ProgramFiles%\ONLYOFFICE\DocumentServer\config\local.json
警告
默认值存储在 default.json 配置文件中,该文件位于上述文件夹中(适用于 Linux 和 Windows)。请不要直接编辑 default.json 文件的内容。每次重启 Docker 容器或将 ONLYOFFICE 文档升级到新版本时,默认值将被恢复,您所做的所有更改将会丢失。
重新启动服务以使配置更改生效:
- Docker
- RPM/DEB packages
supervisorctl restart all
systemctl restart ds-*
参数
| 参数 | 类型 | 示例 | 描述 |
|---|---|---|---|
| services.CoAuthoring.secret.browser.string | string | secret | 定义用于在客户端浏览器请求中生成发送到 ONLYOFFICE 文档的令牌的密钥。 |
| services.CoAuthoring.secret.inbox.string | string | secret | 定义用于生成传入 HTTP 请求中的令牌的密钥,这些请求带有来自文档存储服务到文档命令服务、文档转换服务和文档生成服务的命令。 |
| services.CoAuthoring.secret.outbox.string | string | secret | 定义 密钥 用以通过文档编辑服务的在 传出 HTTP 请求 到 callbackUrl* 地址中生成令牌。 |
| services.CoAuthoring.token.enable.browser | boolean | false | 定义是否启用客户端浏览器请求中的令牌。 |
| services.CoAuthoring.token.enable.request.inbox | boolean | false | 定义是否启用传入HTTP请求中的令牌。 |
| services.CoAuthoring.token.enable.request.outbox | boolean | false | 定义传出HTTP请求 中的令牌是否已启用。 |
示例 local.json 配置
{
"services": {
"CoAuthoring": {
"secret": {
"browser": {
"string": "secret"
},
"inbox": {
"string": "secret"
},
"outbox": {
"string": "secret"
}
},
"token": {
"enable": {
"browser": true,
"request": {
"inbox": true,
"outbox": true
}
}
}
}
}
}
用于生成签名的代码示例
下面是为初始化设置和请求生成签名的示例。所有示例均使用 HMAC-SHA256 算法,并包含所需的库和导入。它们基于不同编程语言的测试范例。我们建议您在项目中使用此代码来生成签名。
- Node.js
- JavaScript
- C#
- Java
- PHP
- Python
- Ruby
- Go
// npm install jsonwebtoken
import jwt from "jsonwebtoken"
function jwtEncode(payload, secret) {
return jwt.sign(payload, secret, {algorithm: "HS256"})
}
async function createJWT(payload, secret) {
const header = {
typ: "JWT",
alg: "HS256",
}
function base64UrlEncode(str) {
return btoa(str)
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=/g, "")
}
const encodedHeader = base64UrlEncode(JSON.stringify(header))
const encodedPayload = base64UrlEncode(JSON.stringify(payload))
const encoder = new TextEncoder()
const algorithm = {name: "HMAC", hash: "SHA-256"}
const key = await crypto.subtle.importKey(
"raw",
encoder.encode(secret),
algorithm,
false,
["sign"]
)
const data = encoder.encode(`${encodedHeader}.${encodedPayload}`)
const signature = await crypto.subtle.sign(algorithm.name, key, data)
const encodedSignature = base64UrlEncode(
String.fromCharCode(...new Uint8Array(signature))
)
return `${encodedHeader}.${encodedPayload}.${encodedSignature}`
}
// NuGet: Install-Package JWT
using JWT;
using JWT.Algorithms;
using JWT.Serializers;
public static string JwtEncode(
IDictionary<string, object> payload,
string secret)
{
var encoder = new JwtEncoder(
new HMACSHA256Algorithm(),
new JsonNetSerializer(),
new JwtBase64UrlEncoder());
return encoder.Encode(payload, secret);
}
// Maven: io.fusionauth:fusionauth-jwt
import io.fusionauth.jwt.Signer;
import io.fusionauth.jwt.hmac.HMACSigner;
import io.fusionauth.jwt.domain.JWT;
public static String jwtEncode(
Map<String, Object> payload,
String secret) {
Signer signer = HMACSigner.newSHA256Signer(secret);
JWT jwt = new JWT();
for (String key : payload.keySet()) {
jwt.addClaim(key, payload.get(key));
}
return JWT.getEncoder().encode(jwt, signer);
}
// composer require firebase/php-jwt
use Firebase\JWT\JWT;
function jwtEncode($payload, $secret) {
return JWT::encode($payload, $secret, "HS256");
}
# pip install PyJWT
import jwt
def jwt_encode(payload, secret):
return jwt.encode(payload, secret, algorithm="HS256")
# gem install jwt
require "jwt"
def jwt_encode(payload, secret)
JWT.encode(payload, secret, "HS256")
end
// go get github.com/golang-jwt/jwt/v5
import (
"github.com/golang-jwt/jwt/v5"
)
func jwtEncode(
claims jwt.MapClaims,
secret []byte,
) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString(secret)
}