319 lines
No EOL
17 KiB
HTML
319 lines
No EOL
17 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head><meta content="width=device-width, initial-scale=1.0" name="viewport" />
|
|
<title>Tent - the decentralized social web</title>
|
|
<link href="/assets/css/bootstrap-cb0b9b6b1fd.css" media="screen" rel="stylesheet" type="text/css" />
|
|
<link href="/assets/css/bootstrap-responsive-cb034fa29d4.css" media="screen" rel="stylesheet" type="text/css" />
|
|
<link href="/assets/css/style-cba5092b759.css" media="screen" rel="stylesheet" type="text/css" />
|
|
<link href="/blog.xml" rel="alternate" title="Atom feed" type="application/atom+xml" />
|
|
<script type="text/javascript">var _gaq = _gaq || [];
|
|
_gaq.push(['_setAccount', 'UA-34258323-1']);
|
|
_gaq.push(['_setSiteSpeedSampleRate', 50]);
|
|
_gaq.push(['_trackPageview']);
|
|
(function() {
|
|
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
|
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
|
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
|
})();</script></head>
|
|
<body><div class="navbar navbar-static-top">
|
|
<div class="navbar-inner">
|
|
<a class="brand" href="/">Tent</a>
|
|
<ul class="nav"><li ><a href="/blog">Blog</a></li><li class="active"><a href="/docs">Docs</a></li></ul>
|
|
</div>
|
|
</div><div class="container doc">
|
|
<div class="row">
|
|
<div class="span2">
|
|
<ul class="nav nav-list well">
|
|
<li class="nav-header">Tent</li>
|
|
<li><li ><a href="/docs">Protocol Introduction</a></li></li>
|
|
<li><li class="active"><a href="/docs/server-protocol">Server Protocol</a></li></li>
|
|
<li><li ><a href="/docs/app-auth">App Authentication</a></li></li>
|
|
<li><li ><a href="/docs/app-server">Server API for Apps</a></li></li>
|
|
<li class="nav-header">Types</li>
|
|
<li><li ><a href="/docs/post-types">Post Types</a></li></li>
|
|
<li><li ><a href="/docs/info-types">Profile Info Types</a></li></li>
|
|
</ul>
|
|
</div>
|
|
<div class="span8">
|
|
<div class="alert alert-block">
|
|
<h4>Alpha Documentation </h4>
|
|
<p>These docs are very rough, incorrect, and incomplete. They will be modified heavily over the next few weeks.</p>
|
|
<p>Please contribute by making Pull Requests and Issues on the <a href="https://github.com/tent/tent.io">GitHub repository</a>.</p>
|
|
</div><h2>Tent Server-Server Communication Protocol</h2>
|
|
|
|
<p>This document describes the protocol that Tent servers use to communicate with
|
|
each other.</p>
|
|
|
|
<h3>Server Discovery</h3>
|
|
|
|
<p>Server discovery is done through HTTP <code>Link</code> headers as well as HTML <code>link</code>
|
|
tags. Multiple links may be presented, and should be tried by the client in
|
|
order.</p>
|
|
|
|
<h4>HTTP <code>Link</code> Header</h4>
|
|
|
|
<p>The HTTP header allows discovery of Tent servers by just doing a HEAD request
|
|
instead of getting the page and parsing it for the <code>link</code> tag. It should be
|
|
added to all responses associated with the Tent entity.</p>
|
|
<div class="highlight"><pre>Link: <https://tent.titanous.com/profile>; rel="https://tent.io/rels/profile"
|
|
</pre>
|
|
</div>
|
|
|
|
<h4>HTML <code>link</code> tag</h4>
|
|
|
|
<p>The <code>link</code> tag should be placed in the <code>head</code> tag of all HTML pages associated
|
|
with the Tent entity.</p>
|
|
<div class="highlight"><pre><span class="nt"><link</span> <span class="na">href=</span><span class="s">"https://tent.titanous.com/profile"</span> <span class="na">rel=</span><span class="s">"https://tent.io/rels/profile"</span> <span class="nt">/></span>
|
|
</pre>
|
|
</div>
|
|
|
|
<h3>Follow an entity</h3>
|
|
|
|
<p>A follow request is required in order to receive notifications about posts
|
|
published by an entity.</p>
|
|
|
|
<h3>POST /followers</h3>
|
|
<div class="highlight"><pre>POST /followers HTTP/1.1
|
|
Content-Type: application/vnd.tent.v0+json
|
|
Accept: application/vnd.tent.v0+json
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre><span class="p">{</span>
|
|
<span class="nt">"entity"</span><span class="p">:</span> <span class="s2">"https://example.org"</span><span class="p">,</span>
|
|
<span class="nt">"types"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"all"</span>
|
|
<span class="p">],</span>
|
|
<span class="nt">"licenses"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"http://creativecommons.org/licenses/by/3.0/"</span>
|
|
<span class="p">]</span>
|
|
<span class="p">}</span>
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre>HTTP/1.1 200 OK
|
|
Content-Type: application/vnd.tent.v0+json
|
|
Content-Length: 254
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre><span class="p">{</span>
|
|
<span class="nt">"entity"</span><span class="p">:</span> <span class="s2">"https://example.org"</span><span class="p">,</span>
|
|
<span class="nt">"permissions"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"public"</span><span class="p">:</span> <span class="kc">false</span>
|
|
<span class="p">},</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"7m3dto"</span><span class="p">,</span>
|
|
<span class="nt">"mac_key_id"</span><span class="p">:</span> <span class="s2">"s:16e9933f"</span><span class="p">,</span>
|
|
<span class="nt">"mac_key"</span><span class="p">:</span> <span class="s2">"fd45af54f59b930e5e6eab4bf1e6a0f3"</span><span class="p">,</span>
|
|
<span class="nt">"mac_algorithm"</span><span class="p">:</span> <span class="s2">"hmac-sha-256"</span><span class="p">,</span>
|
|
<span class="nt">"licenses"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"http://creativecommons.org/licenses/by/3.0/"</span>
|
|
<span class="p">],</span>
|
|
<span class="nt">"types"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"all"</span>
|
|
<span class="p">]</span>
|
|
<span class="p">}</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<h2>Authentication</h2>
|
|
|
|
<p>All requests should be made using SSL.</p>
|
|
|
|
<p>Authentication is required to access resources that are not marked as public.</p>
|
|
|
|
<p>Tent uses <a href="http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-01">MAC Access
|
|
Authentication</a>
|
|
for all requests.</p>
|
|
|
|
<p>All requests must be signed using MAC, and all notifications from the server
|
|
are signed as well.</p>
|
|
|
|
<h2>Get Current Following</h2>
|
|
|
|
<h3>GET /followers/:id</h3>
|
|
<div class="highlight"><pre>GET /followers/7m3dto HTTP/1.1
|
|
Accept: application/vnd.tent.v0+json
|
|
Authorization: MAC id="s:16e9933f", ts="1346984266", nonce="3824e1", mac="aRnrSo+80AHRru2FJE1Sj6GfCsmpKcyv7w5FZONAtOM="
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre>HTTP/1.1 200 OK
|
|
Content-Type: application/vnd.tent.v0+json
|
|
Last-Modified: Fri, 07 Sep 2012 02:17:46 GMT
|
|
Cache-Control: private
|
|
Content-Length: 152
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre><span class="p">{</span>
|
|
<span class="nt">"entity"</span><span class="p">:</span> <span class="s2">"https://example.org"</span><span class="p">,</span>
|
|
<span class="nt">"permissions"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"public"</span><span class="p">:</span> <span class="kc">false</span>
|
|
<span class="p">},</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"7m3dto"</span><span class="p">,</span>
|
|
<span class="nt">"licenses"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"http://creativecommons.org/licenses/by/3.0/"</span>
|
|
<span class="p">],</span>
|
|
<span class="nt">"types"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"all"</span>
|
|
<span class="p">]</span>
|
|
<span class="p">}</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<h2>Edit Following</h2>
|
|
|
|
<h3>PUT /followers/:id</h3>
|
|
<div class="highlight"><pre>PUT /followers/7m3dto HTTP/1.1
|
|
Content-Type: application/vnd.tent.v0+json
|
|
Accept: application/vnd.tent.v0+json
|
|
Authorization: MAC id="s:16e9933f", ts="1346984266", nonce="6e4ff8", mac="MAr2L6Z1ZcAe4tv5XGmafCUH8w/OrkUFpJKhK8dtoBs="
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre><span class="p">{</span>
|
|
<span class="nt">"entity"</span><span class="p">:</span> <span class="s2">"https://example.org"</span><span class="p">,</span>
|
|
<span class="nt">"licenses"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"http://creativecommons.org/licenses/by/3.0/"</span>
|
|
<span class="p">],</span>
|
|
<span class="nt">"types"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"https://tent.io/types/post/essay/v0.1.0#full"</span>
|
|
<span class="p">]</span>
|
|
<span class="p">}</span>
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre>HTTP/1.1 200 OK
|
|
Content-Type: application/vnd.tent.v0+json
|
|
Content-Length: 193
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre><span class="p">{</span>
|
|
<span class="nt">"entity"</span><span class="p">:</span> <span class="s2">"https://example.org"</span><span class="p">,</span>
|
|
<span class="nt">"permissions"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"public"</span><span class="p">:</span> <span class="kc">false</span>
|
|
<span class="p">},</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"7m3dto"</span><span class="p">,</span>
|
|
<span class="nt">"licenses"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"http://creativecommons.org/licenses/by/3.0/"</span>
|
|
<span class="p">],</span>
|
|
<span class="nt">"types"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"https://tent.io/types/post/essay/v0.1.0#full"</span>
|
|
<span class="p">]</span>
|
|
<span class="p">}</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<h2>Stop Following</h2>
|
|
|
|
<h3>DELETE /followers/:id</h3>
|
|
<div class="highlight"><pre>DELETE /followers/eazohw HTTP/1.1
|
|
Accept: application/vnd.tent.v0+json
|
|
Authorization: MAC id="s:16e9933f", ts="1346984266", nonce="fa20ba", mac="SkbEBnIsBUvZ9jLce6cXfry7dqNN9OELnnF1UvwkHys="
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre>HTTP/1.1 403 Forbidden
|
|
Content-Type: text/html
|
|
Content-Length: 12
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre>Unauthorized
|
|
</pre>
|
|
</div>
|
|
|
|
<h2>Fetch Posts</h2>
|
|
|
|
<h3>GET /posts</h3>
|
|
<div class="highlight"><pre>GET /posts HTTP/1.1
|
|
Accept: application/vnd.tent.v0+json
|
|
Authorization: MAC id="s:16e9933f", ts="1346984266", nonce="11a3ee", mac="30RvjuvuDkTitC+iubWLvMfqyr2JegqtrKaSE+cEN78="
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre>HTTP/1.1 200 OK
|
|
Content-Type: application/vnd.tent.v0+json
|
|
Last-Modified: Fri, 07 Sep 2012 02:17:46 GMT
|
|
Cache-Control: private
|
|
Content-Length: 378
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre><span class="p">[</span>
|
|
<span class="p">{</span>
|
|
<span class="nt">"entity"</span><span class="p">:</span> <span class="s2">"https://example.org"</span><span class="p">,</span>
|
|
<span class="nt">"type"</span><span class="p">:</span> <span class="s2">"https://tent.io/types/post/status/v0.1.0"</span><span class="p">,</span>
|
|
<span class="nt">"licenses"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"http://creativecommons.org/licenses/by/3.0/"</span>
|
|
<span class="p">],</span>
|
|
<span class="nt">"content"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"text"</span><span class="p">:</span> <span class="s2">"Just landed."</span><span class="p">,</span>
|
|
<span class="nt">"location"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"type"</span><span class="p">:</span> <span class="s2">"Point"</span><span class="p">,</span>
|
|
<span class="nt">"coordinates"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="mi">50</span><span class="err">.</span><span class="mi">923878</span><span class="p">,</span>
|
|
<span class="mi">4</span><span class="err">.</span><span class="mi">028605</span>
|
|
<span class="p">]</span>
|
|
<span class="p">}</span>
|
|
<span class="p">},</span>
|
|
<span class="nt">"published_at"</span><span class="p">:</span> <span class="mi">1346984266</span><span class="p">,</span>
|
|
<span class="nt">"permissions"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"public"</span><span class="p">:</span> <span class="kc">true</span>
|
|
<span class="p">},</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"xk3mlq"</span><span class="p">,</span>
|
|
<span class="nt">"app"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"url"</span><span class="p">:</span> <span class="s2">"http://example.com"</span><span class="p">,</span>
|
|
<span class="nt">"name"</span><span class="p">:</span> <span class="s2">"FooApp"</span>
|
|
<span class="p">},</span>
|
|
<span class="nt">"attachments"</span><span class="p">:</span> <span class="p">[</span>
|
|
|
|
<span class="p">]</span>
|
|
<span class="p">}</span>
|
|
<span class="p">]</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<h3>GET /posts/:id</h3>
|
|
<div class="highlight"><pre>GET /posts/xk3mlq HTTP/1.1
|
|
Accept: application/vnd.tent.v0+json
|
|
Authorization: MAC id="s:16e9933f", ts="1346984266", nonce="e9d768", mac="gaw/GTjat0ANZmdoo+X4NHpAk+SuJNLj+rSGdcD0JbE="
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre>HTTP/1.1 200 OK
|
|
Content-Type: application/vnd.tent.v0+json
|
|
Last-Modified: Fri, 07 Sep 2012 02:17:46 GMT
|
|
Cache-Control: public
|
|
Content-Length: 376
|
|
</pre>
|
|
</div>
|
|
<div class="highlight"><pre><span class="p">{</span>
|
|
<span class="nt">"entity"</span><span class="p">:</span> <span class="s2">"https://example.org"</span><span class="p">,</span>
|
|
<span class="nt">"type"</span><span class="p">:</span> <span class="s2">"https://tent.io/types/post/status/v0.1.0"</span><span class="p">,</span>
|
|
<span class="nt">"licenses"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="s2">"http://creativecommons.org/licenses/by/3.0/"</span>
|
|
<span class="p">],</span>
|
|
<span class="nt">"content"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"text"</span><span class="p">:</span> <span class="s2">"Just landed."</span><span class="p">,</span>
|
|
<span class="nt">"location"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"type"</span><span class="p">:</span> <span class="s2">"Point"</span><span class="p">,</span>
|
|
<span class="nt">"coordinates"</span><span class="p">:</span> <span class="p">[</span>
|
|
<span class="mi">50</span><span class="err">.</span><span class="mi">923878</span><span class="p">,</span>
|
|
<span class="mi">4</span><span class="err">.</span><span class="mi">028605</span>
|
|
<span class="p">]</span>
|
|
<span class="p">}</span>
|
|
<span class="p">},</span>
|
|
<span class="nt">"published_at"</span><span class="p">:</span> <span class="mi">1346984266</span><span class="p">,</span>
|
|
<span class="nt">"permissions"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"public"</span><span class="p">:</span> <span class="kc">true</span>
|
|
<span class="p">},</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"xk3mlq"</span><span class="p">,</span>
|
|
<span class="nt">"app"</span><span class="p">:</span> <span class="p">{</span>
|
|
<span class="nt">"url"</span><span class="p">:</span> <span class="s2">"http://example.com"</span><span class="p">,</span>
|
|
<span class="nt">"name"</span><span class="p">:</span> <span class="s2">"FooApp"</span>
|
|
<span class="p">},</span>
|
|
<span class="nt">"attachments"</span><span class="p">:</span> <span class="p">[</span>
|
|
|
|
<span class="p">]</span>
|
|
<span class="p">}</span>
|
|
</pre>
|
|
</div>
|
|
|
|
<h2>Notifications</h2>
|
|
|
|
<p>Notifications of new content are sent as POST requests to <code>/posts</code> and
|
|
authenticated using the negotiated credentials.</p>
|
|
</div>
|
|
</div>
|
|
</div><footer>© 2012 Apollic Software, LLC</footer></body>
|
|
</html> |