如何处理ONLYOFFICE文档服务器与Java Web应用间的安全认证和授权?

处理 ONLYOFFICE 文档服务器与 Java Web 应用之间的安全认证和授权,通常涉及以下几个关键步骤和技术:

1. JWT (JSON Web Token) 认证

  • 启用 JWT:

    • ONLYOFFICE 文档服务器使用 JWT 来保护文档免受未经授权的访问。从 ONLYOFFICE Docs v.7.2 开始,默认启用 JWT,并自动生成密钥。
    • 在 ONLYOFFICE 文档服务器的配置文件 local.json 中,确保 JWT 启用,并设置密钥。
    {
      "services": {
        "CoAuthoring": {
          "token": {
            "enable": {
              "request": {
                "inbox": true,
                "outbox": true
              },
              "browser": true
            }
          },
          "secret": {
            "inbox": {
              "string": "yoursecret"
            },
            "outbox": {
              "string": "yoursecret"
            },
            "session": {
              "string": "yoursecret"
            }
          }
        }
      }
    }
    
  • 生成 JWT:

    • 在 Java Web 应用中,使用相同的密钥生成 JWT,并将其添加到发送给 ONLYOFFICE 文档服务器的配置中。
    • JWT 需要包含文档的相关信息,例如文档 ID、用户权限等。
  • 验证 JWT:

    • ONLYOFFICE 文档服务器在接收到请求时,会验证 JWT 的有效性,确保请求的合法性。

2. 生成认证 Token

  • 创建认证 Token:

    • ONLYOFFICE 提供 API 认证方式,通过生成一个 Token 并在 HTTP 请求头中传递来实现。

    • Token 的格式如下:

      ASC pkey : datetime : hash
      

      其中pkey是一个随机字符串,datetime是 UTC 时间,hash是使用 HMAC-SHA1 算法计算出的哈希值。

  • 示例代码 (Java):

    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import java.time.OffsetDateTime;
    import java.time.ZoneOffset;
    import java.time.format.DateTimeFormatter;
    import java.util.Base64;
    
    public class OnlyOfficeAuth {
        public static String createAuthToken(String pkey, String machinekey) throws Exception {
            OffsetDateTime date = OffsetDateTime.now(ZoneOffset.UTC);
            String time = date.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
            String data = time + "\n" + pkey;
            SecretKeySpec signingKey = new SecretKeySpec(machinekey.getBytes(), "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);
            String hash = Base64.getUrlEncoder().encodeToString(mac.doFinal(data.getBytes()));
            return String.format("ASC %1$s:%2$s:%3$s", pkey, time, hash);
        }
    }
    
  • 传递 Token:

    • 将生成的 Token 放在 HTTP 请求的 Authorization 头部中。
    Authorization: ASC pkey:datetime:hash
    

3. 权限控制

  • 用户角色:

    • 在 Java Web 应用中,定义不同的用户角色(例如管理员、编辑者、查看者),并为每个角色分配不同的权限。
  • 文档权限:

    • 根据用户角色和文档属性,动态生成 ONLYOFFICE 编辑器的配置。例如,只允许编辑者修改文档,查看者只能查看文档内容。
  • 配置示例:

    Config config = new Config();
    config.setDocumentId(documentId);
    config.setMode(mode); // "edit" or "view"
    config.setPermissions(permissions); // 设置用户权限
    

4. Callback 处理

  • 验证 Callback:
    • ONLYOFFICE 文档服务器会通过 Callback URL 将文档的编辑状态和结果通知给 Java Web 应用。
    • 在 Callback 处理程序中,验证请求的来源和 JWT 的有效性,确保请求的安全性。
  • 处理逻辑:
    • 根据 Callback 的内容,更新文档的状态、保存文档内容等。

5. 安全存储

  • 加密存储:
    • 对存储在服务器上的文档进行加密,防止未经授权的访问。
  • 访问控制:
    • 实施严格的访问控制策略,只允许授权用户访问文档。

总结

通过以上步骤,可以实现 ONLYOFFICE 文档服务器与 Java Web 应用之间的安全认证和授权。关键在于使用 JWT 进行身份验证,并结合用户角色和文档权限进行细粒度的权限控制。同时,确保 Callback 处理的安全性,并对存储的文档进行加密和访问控制,以防止未经授权的访问。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐