繁体   English   中英

Etherpad 客户端如何学习服务器的 api 密钥?

[英]How does an Etherpad client learn the server's api key?

我正在尝试从 Java 应用程序访问 Etherpad。 最终目标是将现有编辑器(BlueJ 的 Java 编辑器)链接到一个垫子,以便学生在进行 Java 练习时可以在 BlueJ编辑器中进行协作。 我自己没有托管这个垫——我想改用一个公开可用的 Etherpad(因为学生也会这样做)。

我在https://github.com/nilsfr/java-etherpad-lite找到了低级客户端 Etherpad 协议的 Java 实现,我正在尝试构建。 它提供了以下示例:

EPLiteClient client = new EPLiteClient("http://localhost:9001", "K8OF91QMQYUvrNu3e9rJ7FnnVgaB3m9q");

// Create pad and set text
client.createPad("my_pad");
client.setText("my_pad", "foo!!");

// Get pad text
String text = client.getText("my_pad").get("text").toString();

// Get list of all pad ids
Map result = client.listAllPads();
List padIds = (List) result.get("padIDs");

显然,需要知道服务器端的 api 键(示例第一行中的构造函数调用,第二个参数)。 当我尝试使用任意或空 API 密钥的示例时,服务器返回 HTTP 状态代码 405 或 401,具体取决于所使用的确切 ZE6B391A8D2C4D45902A23A8B6585703D。

我尝试使用 curl 而不是 Java 访问焊盘:

me@computer: curl -vi "https://pad.piratensommer.de/api/1.2.13/setText?apikey=&padId=bethpad-test" --get --data-urlencode "text=example"
*   Trying 2a01:4f8:211:1405::3030:443...
* TCP_NODELAY set
* Connected to pad.piratensommer.de (2a01:4f8:211:1405::3030) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=pad.piratensommer.de
*  start date: Nov 17 18:06:54 2021 GMT
*  expire date: Feb 15 18:06:53 2022 GMT
*  subjectAltName: host "pad.piratensommer.de" matched cert's "pad.piratensommer.de"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
> GET /api/1.2.13/setText?apikey=&padId=bethpad-test&text=example HTTP/1.1
> Host: pad.piratensommer.de
> User-Agent: curl/7.68.0
> Accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Mark bundle as not supporting multiuse
< HTTP/1.1 401 Unauthorized
HTTP/1.1 401 Unauthorized
< Date: Sun, 09 Jan 2022 21:37:08 GMT
Date: Sun, 09 Jan 2022 21:37:08 GMT
< Server: Apache/2.4.29 (Ubuntu)
Server: Apache/2.4.29 (Ubuntu)
< X-Powered-By: Express
X-Powered-By: Express
< X-UA-Compatible: IE=Edge,chrome=1
X-UA-Compatible: IE=Edge,chrome=1
< Referrer-Policy: same-origin
Referrer-Policy: same-origin
< Content-Type: application/json; charset=utf-8
Content-Type: application/json; charset=utf-8
< Content-Length: 54
Content-Length: 54
< ETag: W/"36-dbJd0O+vdNi3zPpwRXE+1EGLTho"
ETag: W/"36-dbJd0O+vdNi3zPpwRXE+1EGLTho"
< Set-Cookie: express_sid=s%3A05JnHPsNQe1IjdbJZ-amku0rMquAdHW_.WLoGsw9twT3ZRSh2CWfi1afJY5%2FejwZdIqgh%2BQpYpnE; Path=/; HttpOnly; SameSite=None
Set-Cookie: express_sid=s%3A05JnHPsNQe1IjdbJZ-amku0rMquAdHW_.WLoGsw9twT3ZRSh2CWfi1afJY5%2FejwZdIqgh%2BQpYpnE; Path=/; HttpOnly; SameSite=None
< Via: 1.1 pad.piratensommer.de
Via: 1.1 pad.piratensommer.de

< 
* Connection #0 to host pad.piratensommer.de left intact
{"code":4,"message":"no or wrong API Key","data":null}

最相关的行显然是最后一行,证明我正在与 Etherpad 服务器通话,但不允许连接(对于长 output 感到抱歉,我认为“curl -v”冗长的 output 可能对某些人有帮助)。

问题一:有没有办法知道或学习服务器的API密钥? 一方面不应该,因为该密钥应该是秘密的。 另一方面,pad可以通过简单的链接共享,因此服务器确实接受不知道 API 密钥(但)的 HTTP 客户端,至少是基于浏览器的客户端。

问题 2:所以我想知道如果用户只是输入一个链接,但没有 api 键,“普通”Etherpad 页面如何连接到服务器?

问题 3:是否有其他我不知道的连接到 Etherpad 服务器的方式(当我不自己托管它时)?

Question 4: The Etherpad HTTP/JSON API documentation at https://etherpad.org/doc/v1.8.4/#index_authentication contains the sentences "Only Etherpad and the requesting application knows this key. Token management will not be exposed through this API 。” 第二句具体是什么意思?

问题 5:上面提到的 Java 客户端实现非常古老,但似乎是我能找到的最好的一个。 有谁知道人们使用什么库从 Java 连接到 Etherpad?

感谢您的任何帮助,或提供帮助的指针!

编辑添加: https://github.com/ether/etherpad-lite/issues/284的错误报告讨论表明从 Z293C9EA246FF9985DC6F62A6 请求中提取 API 密钥应该不难如何。 所以我的问题 6是:我该怎么做?

根据文档

每个 Etherpad 部署都有一个令牌。 该令牌将是随机字符串,由 Etherpad 在第一次启动时生成。 它将保存在 Etherpad 根文件夹的 APIKEY.txt 中。

即使您没有自己的 Etherpad 实例运行,您也需要 APIKEY。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM