1、介绍
Etherpad 是一个基于 nodejs
的在线文档编辑器,服务端性能可以得到保证,多个客户端的操作是即时同步的,而且对文档数据提供了存储的支持。
2、运行
命令行进行项目根目录后,运行 /bin/run.sh
,项目即可运行到 127.0.0.1:9001
,输入 /admin
可进入管理员界面进行配置管理(开启 admin
管理界面需要将 settings.json
中的 users
注释去掉)。在管理员界面修改 settings
后可进行保存和重启。
3、权限控制
默认情况下,一个记事本能被任何人编辑,只要拿到 URL 就可以
要进行权限控制,只有指定的用户才能编辑,接口都是基于 HTTP 的,每个接口都有一个默认参数 apikey
,它的值在第一次启动时生成在 APIKEY.txt
中。
2.1、创建用户
请求: http://127.0.0.1:9001/api/1/createAuthorIfNotExistsFor?apikey=7fc8333b224aae0a8dbe6281e9c8224652b451ded5620aef361330cf9325fcb2&name=Michael&authorMapper=7
响应:
{
"code": 0,
"message": "ok",
"data": {
"authorID": "a.tecfYc0hczapA4JP"
}
}
2.2、创建组,因为权限是居于组的,一个组可以有多个用户,可以有多个记事本,组内的用户都可以编辑
请求: http://127.0.0.1:9001/api/1/createGroupIfNotExistsFor?apikey=7fc8333b224aae0a8dbe6281e9c8224652b451ded5620aef361330cf9325fcb2&groupMapper=group1
响应:
{
"code": 0,
"message": "ok",
"data": {
"groupID": "g.IQChnScQKpJaoNdd"
}
}
2.3、创建组内的记事本,需要用到上一步返回的 groupID
请求: http://127.0.0.1:9001/api/1/createGroupPad?apikey=7fc8333b224aae0a8dbe6281e9c8224652b451ded5620aef361330cf9325fcb2&groupID=g.IQChnScQKpJaoNdd&padName=demo&text=hello world
响应:
{
"code": 0,
"message": "ok",
"data": {
"padID": "g.IQChnScQKpJaoNdd$demo"
}
}
2.3、创建 Session,建立用户与组的关系,validUntil 是 session 的有效期,填一个未来的时间即可,authorId 是用户 ID
请求: http://127.0.0.1:9001/api/1/createSession?apikey=7fc8333b224aae0a8dbe6281e9c8224652b451ded5620aef361330cf9325fcb2&groupID=g.IQChnScQKpJaoNdd&authorID=a.tecfYc0hczapA4JP&validUntil=1593403932000
响应:
{
"code": 0,
"message": "ok",
"data": {
"sessionID": "s.420caf0c3fab1ad123afc11085609e5f"
}
}
2.4、修改 settings 开启权限认证
保存后重启,再去访问/p/demo是无法访问的,界面显示 您没有访问这个记事本的权限,这说明权限起作用了,于是要用到之前生成的 sessionID,打开浏览器控制台进行设置
document.cookie = "sessionID=s.420caf0c3fab1ad123afc11085609e5f"
再次刷新,发现还是提示无权限
其实不能直接通过 /p/demo 访问 demo 记事本的,正确的访问方式是 /p/{padId},这里输入 /p/g.IQChnScQKpJaoNdd$demo 就可以访问到 demo 记事本了
注:如果想将这个记事本分享给其他用户,同时进行编辑,需要先创建用户(如果用户不存在),再建立新用户
4、HTTP API
API 提供的基本功能有
- 创建/删除记事本(pad)
- 授权/禁止访问记事本(pad)
- 获取设置记事本内容
API 版本
可以通过 /api 查询当前版本
请求格式
从1.8开始,可以通过GET或POST无差别地调用API端点。HTTP请求的格式为 /api/ A P I V E R S I O N / APIVERSION/ APIVERSION/FUNCTIONNAME。根据选择的请求方式(GET/POST),参数可以不同地传递
回应格式
响应是以下格式的有效JSON:
{
"code": number,
"message": string,
"data": obj
}
- code 返回码
- 0 一切正常
- 1 参数错误
- 2 内部错误
- 3 没有这样的功能
- 4 没有或错误的API Key
- message 状态消息。一切正常,否则包含错误消息
- data 有效数据
数据类型
- groupID 字符串,组的唯一ID。格式为g.16RANDOMCHARS,例如g.s8oes9dhwrvt0zif
- sessionID 字符串,会话的唯一ID。格式为s.16RANDOMCHARS,例如s.s8oes9dhwrvt0zif
- authorID 字符串,作者的唯一ID。格式为a.16RANDOMCHARS,例如a.s8oes9dhwrvt0zif
- readOnlyID 字符串,是与记事本的只读关系的唯一ID。格式为r.16RANDOMCHARS,例如r.s8oes9dhwrvt0zif
- padID 字符串,格式为GROUPID P A D N A M E , 例 如 , 组 g . s 8 o e s 9 d h w r v t 0 z i f 的 测 试 记 事 本 具 有 p a d I D g . s 8 o e s 9 d h w r v t 0 z i f PADNAME,例如,组g.s8oes9dhwrvt0zif的测试记事本具有padID g.s8oes9dhwrvt0zif PADNAME,例如,组g.s8oes9dhwrvt0zif的测试记事本具有padIDg.s8oes9dhwrvt0zif$test