认证

介绍

通过 onAuthenticate 钩子,你可以检查客户端是否已认证并被授权查看当前文档。在实际应用中,这通常是向 API 发起请求、数据库查询或其他操作。

示例

当抛出错误或拒绝返回的 Promise 时,将终止与客户端的连接(参见服务器钩子生命周期)。如果客户端已被授权和认证,你还可以返回上下文数据,例如用户 id,这些数据将在其他钩子中可访问。但这并非必须。

有关该钩子及其负载的更多信息,请查看其章节

import { Server } from "@hocuspocus/server";

const server = new Server({
  async onAuthenticate(data) {
    const { token } = data;

    // 示例:测试用户是否通过客户端传递的 token 认证
    if (token !== "super-secret-token") {
      throw new Error("未授权!");
    }

    // 你可以设置上下文数据,以便在其他钩子中使用
    return {
      user: {
        id: 1234,
        name: "John",
      },
    };
  },
});

server.listen();

在客户端,你可以将 "token" 参数作为 Hocuspocus 选项之一传递,如下所示:

new HocuspocusProvider({
  url: "ws://127.0.0.1:1234",
  name: "example-document",
  document: ydoc,
  token: "super-secret-token",
});

只读模式

如果你想限制当前用户只能读取文档及其更新,而不能应用更新,可以在 onAuthenticate 钩子的负载中使用 connection 属性:

import { Server } from "@hocuspocus/server";

const usersWithWriteAccess = ["jane", "john", "christina"];

const server = new Server({
  async onAuthenticate(data): Doc {
    // 示例代码,通过请求参数检查当前用户是否拥有写权限。
    // 在实际应用中,你可能会通过 token 从数据库获取用户信息
    if (!usersWithWriteAccess.includes(data.requestParameters.get("user"))) {
      // 将连接设置为只读
      data.connection.readOnly = true;
    }
  },
});

server.listen();