签名

ONLYOFFICE 文档服务器 使用 按JSON Web 令牌 标准生成的令牌。

从 4.2 版开始在 文档服务器 中使用此功能

对于验证设置,需要编辑位于配置文件中的 secret keytoken 参数,配置文件可在以下路径找到(或创建):

对于 Linux - /etc/onlyoffice/documentserver/local.json
对于 Windows - %ProgramFiles%\ONLYOFFICE\DocumentServer\config\local.json
默认值在 default.json 配置文件中可用,该文件位于上述文件夹中(适用于 Linux 和 Windows)。 请不要直接编辑 default.json 文件的内容。 每次重新启动 Docker 容器或将 文档服务器 升级到新版本时都会恢复默认值,并且所有更改都将丢失。

重新启动服务以使配置更改生效:

对于 RPM/DEB 软件包:

systemctl restart ds-*

对于 Docker:

supervisorctl restart all
参数
参数 描述 类型 示例
services.CoAuthoring.secret.browser.string 定义 密钥,用以在客户端生成到ONLYOFFICE文档的 浏览器请求 令牌。 自版本 7.2 起已弃用,请改用 services.CoAuthoring.secret.inbox.string string secret
services.CoAuthoring.secret.inbox.string 定义密钥以在传入 HTTP 请求(从文档存储服务文档命令服务文档转换服务文档生成器服务)的命令中生成令牌, 以及在客户端浏览器请求中向 ONLYOFFICE Docs 发送请求(自版本 7.2 起)时生成令牌。 string secret
services.CoAuthoring.secret.outbox.string 定义密钥,用以通过文档编辑服务的传出HTTP请求回调Url地址中生成令牌。 string secret
services.CoAuthoring.token.enable.browser 定义是否启用客户端浏览器请求中的令牌。 boolean false
services.CoAuthoring.token.enable.request.inbox 定义是否启用传入HTTP请求中的令牌。 boolean false
services.CoAuthoring.token.enable.request.outbox 定义传出HTTP请求中的令牌是否已启用。 boolean false
示例 local.json 配置
{
    "services": {
        "CoAuthoring": {
            "secret": {
                "inbox": {
                    "string": "secret"
                },
                "outbox": {
                    "string": "secret"
                },
            },
            "token": {
                "enable": {
                    "browser": true,
                    "request": {
                        "inbox": true,
                        "outbox": true
                    }
                }
            }
        }
    }
}

下面是为初始化设置和请求生成签名的示例。 它们取自不同编程语言的测试范例。。 我们建议您在项目中使用此代码来生成签名。

public static class JwtManager
{
    private static readonly string Secret;
    public static readonly bool Enabled;

    static JwtManager()
    {
        Secret = WebConfigurationManager.AppSettings["files.docservice.secret"] ?? "";
        Enabled = !string.IsNullOrEmpty(Secret);
    }

    public static string Encode(IDictionary<string, object> payload)
    {
        var encoder = new JwtEncoder(new HMACSHA256Algorithm(),
                                        new JsonNetSerializer(),
                                        new JwtBase64UrlEncoder());
        return encoder.Encode(payload, Secret);
    }
}
public static String CreateToken(Map payloadClaims)
{
    try
    {
        String secret = ConfigManager.GetProperty("files.docservice.secret");
        Signer signer = HMACSigner.newSHA256Signer(secret);
        JWT jwt = new JWT();
        for (String key : payloadClaims.keySet())
        {
            jwt.addClaim(key, payloadClaims.get(key));
        }
        return JWT.getEncoder().encode(jwt, signer);
    }
    catch (Exception e)
    {
        return "";
    }
}
var configServer = require('config').get('server');
var cfgSignatureSecretExpiresIn = configServer.get('token.expiresIn');
var cfgSignatureSecret = configServer.get('token.secret');
var cfgSignatureSecretAlgorithmRequest = configServer.get('token.algorithmRequest');

documentService.getToken = function (data) {
    var options = {algorithm: cfgSignatureSecretAlgorithmRequest, expiresIn: cfgSignatureSecretExpiresIn};
    return jwt.sign(data, cfgSignatureSecret, options);
};
function jwtEncode($payload) {
    return \Firebase\JWT\JWT::encode($payload, $GLOBALS["DOC_SERV_JWT_SECRET"]);
}
def encode(payload):
    return jwt.encode(payload, config.DOC_SERV_JWT_SECRET, algorithm='HS256')

@jwt_secret = Rails.configuration.jwtSecret

class << self
    def encode(payload)
        return JWT.encode payload, @jwt_secret, 'HS256'
    end
end
type onlyofficeJwtManager struct {
    key []byte
}

func (j onlyofficeJwtManager) Sign(payload interface {
    Valid() error
}) (string, error) {
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)
    ss, err := token.SignedString(j.key)

    if err != nil {
        return "", errors.New("could not generate a new jwt")
    }

    return ss, nil
}