【问题标题】:How to create site in share programmatically?如何以编程方式在共享中创建站点?
【发布时间】:2014-12-02 14:23:15
【问题描述】:

这个话题在社区(论坛、博客文章等)中已经出现了很多次,结论是应该通过 REST Post 调用来分享和 URL /service/modules/create-site

原因是某些冲浪特定的东西,如网站仪表板是从共享端创建的。

但是,我整天都在从不同的角度尝试这种方法,总是以响应中的 HTTP 200 结束,并且没有创建共享站点。很郁闷。

我在 Alfresco Enterprise 4.2.3.3 上运行此程序(我怀疑我的问题是由于最近的更改)

为了将其简化为易于复制的内容,我正在关注 Martin Bergljungs 关于该主题的博文 (http://www.ixxus.com/blog201203creating-alfresco-share-sites-javascript/),从使用 curl 开始,如下所示:

  • 使用登录凭据 (login.txt) 创建一个文本文件,其中包含以下内容(更改为适当的值): username=admin&password=admin

  • 使用 json 创建文本文件以创建站点 (site_data.json) {"visibility" : "PUBLIC","title" : "My Test Site","shortName" : "mytestsite", "description" : "My Test Site created from command line", "sitePreset" : "site-dashboard"}

  • 通过请求票证获取 JSESSIONID: curl -v -d @login.txt -H "Content-Type:application/x-www-form-urlencoded" http://localhost:8081/share/page/dologin

  • 将生成的 JSESSIONID 值复制到以下 curl 调用中: curl -v -d @site_data.json -H "Cookie:JSESSIONID=<insert your jsessionid>" -H "Content-Type:application/json" -H "Accept:application/json" http://localhost:8081/share/service/modules/create-site

curl 的输出:

* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8081 (#0)
> POST /share/service/modules/create-site HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8081
> Cookie:JSESSIONID=5963B948684F562A278909AF466D2306
> Content-Type:application/json
> Accept:application/json
> Content-Length: 196
> 
* upload completely sent off: 196 out of 196 bytes
< HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< X-Frame-Options: SAMEORIGIN
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< Content-Language: en-US
< Content-Length: 0
< Date: Tue, 02 Dec 2014 13:57:02 GMT
< 
* Connection #0 to host localhost left intact

如上所示,后一个 curl 调用导致 HTTP 200,但登录共享显示没有创建任何站点:(

顺便说一句。我已禁用 CSRF 令牌过滤器。

更新: 我已经验证上述方法可以在 Alfresco Enterprise 4.1.5 上创建一个站点 我已经验证它在 Alfresco Community 4.2.e 上也失败了 这被报告为一个错误:https://issues.alfresco.com/jira/browse/MNT-11706

更新:由于读者不清楚这个问题,我现在重新表述了

更新:

按照 Dave Websters 的回答,我再次尝试使用以下步骤,但仍禁用 CSRF 令牌:

登录: curl -v -d @login.txt -H "Content-Type:application/x-www-form-urlencoded" http://localhost:8081/share/page/dologin

回复:

POST /share/page/dologin HTTP/1.1 用户代理:curl/7.35.0 主机:本地主机:8081 接受:/ 内容类型:application/x-www-form-urlencoded 内容长度:29

* upload completely sent off: 29 out of 29 bytes
< HTTP/1.1 302 Found
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< X-Frame-Options: SAMEORIGIN
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< Set-Cookie: JSESSIONID=058A52486E4EB12F94D1F95302732616; Path=/share/; HttpOnly
< Set-Cookie: alfLogin=1417618589; Expires=Wed, 10-Dec-2014 14:56:29 GMT; Path=/share
< Set-Cookie: alfUsername3=admin; Expires=Wed, 10-Dec-2014 14:56:29 GMT; Path=/share
< Location: http://localhost:8081/share
< Content-Length: 0
< Date: Wed, 03 Dec 2014 14:56:29 GMT

获取 cookie 值并插入 Daves 代码(去掉 csrf-stuff):

curl 'http://localhost:8081/share/service/modules/create-site' -H 'Cookie: JSESSIONID=058A52486E4EB12F94D1F95302732616; alfLogin=1417618589; alfUsername3=admin;' -H 'Origin: http://localhost:8081' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36' -H 'Content-Type: application/json' -H 'Accept: */*' -H 'Referer: http://localhost:8081/share/page/site/erik/dashboard' -H 'X-Requested-With: application/json' -H 'Connection: keep-alive' --data-binary $'{"visibility":"PUBLIC","title":"erik'","shortName":"erik'","description":"This site is auto generated","sitePreset":"site-dashboard"}' --compressed

但仍然没有生成共享站点,并且仍然是 HTTP 200 响应。日志中也没有错误。这让我抓狂:(

新更新(有效!):

我现在发现,您需要在进行登录调用后“触摸”共享网页脚本,然后才能使用帖子调用 create-site。我通过在两者之间发出获取请求来做到这一点。这需要以某种方式完成以初始化共享会话。

【问题讨论】:

  • 这里没有看到问题。

标签: alfresco alfresco-share


【解决方案1】:

这是我用来以编程方式生成站点的 curl 命令。我手动插入了 JSESSIONID、LOGINCOOKIECONTENTS 和 CSRFTOKEN(两次)内容,但以编程方式获取它们应该可以工作。

curl 'http://localhost:8081/share/service/modules/create-site' -H 'Cookie: JSESSIONID={JSESSIONID}; alfLogin={LOGINCOOKIECONTENTS}; alfUsername3=admin; Alfresco-CSRFToken={CSRFTOKEN};' -H 'Origin: http://localhost:8081' -H 'Accept-Encoding: gzip,deflate,sdch' -H 'Accept-Language: en-US,en;q=0.8' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36' -H 'Content-Type: application/json' -H 'Accept: */*' -H 'Referer: http://localhost:8081/share/page/site/auto-gen-0/dashboard' -H 'X-Requested-With: application/json' -H 'Connection: keep-alive' -H 'Alfresco-CSRFToken: {CSRFTOKEN}' --data-binary $'{"visibility":"PUBLIC","title":"auto-gen'$I'","shortName":"auto-gen-'$I'","description":"This site is auto generated","sitePreset":"site-dashboard"}' --compressed

预期的响应是:

{
   "success": true
}

【讨论】:

  • 太好了,现在我只需要使用 Spring Surf HttpClient 将它翻译成一些 java 代码(如果你有这种代码,也请随时分享 :))跨度>
  • 您从哪里获得 Alfresco-CSRFToken 来满足您的请求?
  • 它在一个名为:Alfresco-CSRFToken 的 cookie 中。如果您已禁用 CSRF 令牌过滤器(根据您的问题),您可以从帖子标题中删除整个 cookie(Alfresco-CSRFToken={CSRFTOKEN};)。
  • 还要补充一点,CSRF令牌cookie值需要在设置前进行url解码。
  • 对不起,我忘记了。事情并没有那么简单:当 CSRF 令牌在 cookie 中时,它被编码,但在标头中,它被解码......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2011-08-23
  • 2010-11-21
  • 2021-07-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多