签名
ONLYOFFICE 文档服务器 使用 按JSON Web 令牌 标准生成的令牌。
从 4.2 版开始在 文档服务器 中使用此功能
对于验证设置,需要编辑位于配置文件中的 secret key 和 token 参数,配置文件可在以下路径找到(或创建):
对于 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 |
{
"services": {
"CoAuthoring": {
"secret": {
"inbox": {
"string": "secret"
},
"outbox": {
"string": "secret"
},
},
"token": {
"enable": {
"browser": true,
"request": {
"inbox": true,
"outbox": true
}
}
}
}
}
}
用于生成签名的代码示例
下面是为初始化设置和请求生成签名的示例。
它们取自不同编程语言的测试范例。。
我们建议您在项目中使用此代码来生成签名。
- C#
- Java
- Node.js
- PHP
- Python
- Ruby
- Go
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
}