2020-01-21 01:25:09 +01:00
<!DOCTYPE html>
< html lang = "en-US" >
< head >
< meta charset = "UTF-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=Edge" >
< title > OAuth - Gancio</ title >
< link rel = "shortcut icon" href = "https://gancio.org/favicon.ico" type = "image/x-icon" >
< link rel = "stylesheet" href = "https://gancio.org/assets/css/just-the-docs.css" >
< link rel = "stylesheet" href = "https://gancio.org/assets/css/style.css" >
2020-01-21 22:14:46 +01:00
< link rel = "stylesheet" href = "https://gancio.org/assets/css/premonition.css" >
< link rel = "stylesheet" href = "https://gancio.org/assets/css/fa.min.css" >
2020-01-21 01:25:09 +01:00
< script type = "text/javascript" src = "https://gancio.org/assets/js/vendor/lunr.min.js" ></ script >
< script type = "text/javascript" src = "https://gancio.org/assets/js/just-the-docs.js" ></ script >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< script src = "https://gancio.org/assets/js/jquery-3.3.1.min.js" ></ script >
< link rel = "stylesheet" href = "https://gancio.org/assets/css/jquery.fancybox.min.css" />
< script src = "https://gancio.org/assets/js/jquery.fancybox.min.js" ></ script >
<!-- Begin Jekyll SEO tag v2.6.1 -->
< title > OAuth | Gancio</ title >
< meta name = "generator" content = "Jekyll v3.8.6" />
< meta property = "og:title" content = "OAuth" />
< meta property = "og:locale" content = "en_US" />
< meta name = "description" content = "A shared agenda for local communities with AP support" />
< meta property = "og:description" content = "A shared agenda for local communities with AP support" />
2020-01-21 22:14:46 +01:00
< link rel = "canonical" href = "https://gancio.org/dev/oauth" />
< meta property = "og:url" content = "https://gancio.org/dev/oauth" />
2020-01-21 01:25:09 +01:00
< meta property = "og:site_name" content = "Gancio" />
< script type = "application/ld+json" >
2020-01-21 22:14:46 +01:00
{ "@type" : "WebPage" , "headline" : "OAuth" , "url" : "https://gancio.org/dev/oauth" , "description" : "A shared agenda for local communities with AP support" , "@context" : "https://schema.org" }</ script >
2020-01-21 01:25:09 +01:00
<!-- End Jekyll SEO tag -->
</ head >
< body >
< div class = "page-wrap" >
< div class = "side-bar" >
< a href = "https://gancio.org/" class = "site-title fs-6 lh-tight" > Gancio</ a >
< span class = "fs-3" >< button class = "js-main-nav-trigger navigation-list-toggle btn btn-outline" type = "button" data-text-toggle = "Hide" > Menu</ button ></ span >
< div class = "navigation main-nav js-main-nav" >
< nav role = "navigation" aria-label = "Main navigation" >
< ul class = "navigation-list" >
< li class = "navigation-list-item active" >
< a href = "https://gancio.org/404.html" class = "navigation-list-link" ></ a >
</ li >
< li class = "navigation-list-item" >
< a href = "https://gancio.org/" class = "navigation-list-link" > Home</ a >
</ li >
2020-01-21 22:14:46 +01:00
2020-01-21 01:25:09 +01:00
< li class = "navigation-list-item" >
< a href = "https://gancio.org/install" class = "navigation-list-link" > Install</ a >
< ul class = "navigation-list-child-list " >
< li class = "navigation-list-item " >
< a href = "https://gancio.org/install/debian" class = "navigation-list-link" > Debian</ a >
</ li >
< li class = "navigation-list-item " >
< a href = "https://gancio.org/install/docker" class = "navigation-list-link" > Docker</ a >
</ li >
< li class = "navigation-list-item " >
< a href = "https://gancio.org/install/nginx" class = "navigation-list-link" > Nginx</ a >
</ li >
2020-01-21 22:14:46 +01:00
2020-01-21 01:25:09 +01:00
</ ul >
</ li >
< li class = "navigation-list-item" >
< a href = "https://gancio.org/config" class = "navigation-list-link" > Configuration</ a >
</ li >
2020-01-21 22:14:46 +01:00
< li class = "navigation-list-item active" >
2020-01-21 01:25:09 +01:00
< a href = "https://gancio.org/dev" class = "navigation-list-link" > Hacking</ a >
< ul class = "navigation-list-child-list " >
2020-01-21 22:14:46 +01:00
2020-01-21 01:25:09 +01:00
< li class = "navigation-list-item " >
2020-01-21 22:14:46 +01:00
< a href = "https://gancio.org/dev/structure" class = "navigation-list-link" > Project Structure</ a >
2020-01-21 01:25:09 +01:00
</ li >
2020-01-21 22:14:46 +01:00
< li class = "navigation-list-item active" >
2020-01-21 01:25:09 +01:00
2020-01-21 22:14:46 +01:00
< a href = "https://gancio.org/dev/oauth" class = "navigation-list-link active" > OAuth</ a >
2020-01-21 01:25:09 +01:00
</ li >
2020-01-21 22:14:46 +01:00
< li class = "navigation-list-item " >
< a href = "https://gancio.org/dev/locales" class = "navigation-list-link" > Internationalization</ a >
</ li >
2020-01-21 01:25:09 +01:00
</ ul >
</ li >
< li class = "navigation-list-item" >
< a href = "https://gancio.org/instances" class = "navigation-list-link" > Instances</ a >
</ li >
2020-01-21 22:14:46 +01:00
2020-01-21 01:25:09 +01:00
< li class = "navigation-list-item" >
< a href = "https://gancio.org/about" class = "navigation-list-link" > About</ a >
</ li >
< li class = "navigation-list-item" >
2020-01-21 22:14:46 +01:00
< a href = "https://gancio.org/contacts" class = "navigation-list-link" > Contacts</ a >
2020-01-21 01:25:09 +01:00
</ li >
2020-01-21 22:14:46 +01:00
< li class = "navigation-list-item" >
2020-01-21 01:25:09 +01:00
2020-01-21 22:14:46 +01:00
< a href = "https://gancio.org/federation" class = "navigation-list-link" > Federation</ a >
2020-01-21 01:25:09 +01:00
</ li >
< li class = "navigation-list-item" >
< a href = "https://gancio.org/changelog" class = "navigation-list-link" > Changelog</ a >
</ li >
</ ul >
</ nav >
</ div >
< footer role = "contentinfo" class = "site-footer" >
< p class = "text-small text-grey-dk-000 mb-0" > This site uses < a href = "https://github.com/pmarsceill/just-the-docs" > Just the Docs</ a > , a documentation theme for Jekyll.</ p >
</ footer >
</ div >
< div class = "main-content-wrap js-main-content" tabindex = "0" >
< div class = "page-header" >
< div class = "main-content" >
< div class = "search js-search" >
< div class = "search-input-wrap" >
< input type = "text" class = "js-search-input search-input" tabindex = "0" placeholder = "Search Gancio" aria-label = "Search Gancio" autocomplete = "off" >
< svg width = "14" height = "14" viewBox = "0 0 28 28" xmlns = "http://www.w3.org/2000/svg" class = "search-icon" >< title > Search</ title >< g fill-rule = "nonzero" >< path d = "M17.332 20.735c-5.537 0-10-4.6-10-10.247 0-5.646 4.463-10.247 10-10.247 5.536 0 10 4.601 10 10.247s-4.464 10.247-10 10.247zm0-4c3.3 0 6-2.783 6-6.247 0-3.463-2.7-6.247-6-6.247s-6 2.784-6 6.247c0 3.464 2.7 6.247 6 6.247z" />< path d = "M11.672 13.791L.192 25.271 3.02 28.1 14.5 16.62z" /></ g ></ svg >
</ div >
< div class = "js-search-results search-results-wrap" ></ div >
</ div >
< ul class = "list-style-none text-small mt-md-1 mb-md-1 pb-4 pb-md-0 js-aux-nav aux-nav" >
< li class = "d-inline-block my-0 mr-2" >< a href = "https://blog.gancio.org" > Blog</ a ></ li >
< li class = "d-inline-block my-0 mr-2" >< a href = "https://framagit.org/les/gancio" > Source</ a ></ li >
2020-01-21 22:14:46 +01:00
< li class = "d-inline-block my-0 mr-2" >< a href = "https://socialhub.activitypub.rocks/c/software/gancio" > Forum</ a ></ li >
< li class = "d-inline-block my-0" >< a href = "https://mastodon.cisti.org/@gancio" > Mastodon</ a ></ li >
2020-01-21 01:25:09 +01:00
</ ul >
</ div >
</ div >
< div class = "main-content" >
2020-01-21 22:14:46 +01:00
< nav class = "breadcrumb-nav" >
< ol class = "breadcrumb-nav-list" >
< li class = "breadcrumb-nav-list-item" >< a href = "https://gancio.org/dev" > Hacking</ a ></ li >
< li class = "breadcrumb-nav-list-item" >< span > OAuth</ span ></ li >
</ ol >
</ nav >
2020-01-21 01:25:09 +01:00
< div id = "main-content" class = "page-content" role = "main" >
2020-01-21 22:14:46 +01:00
< div class = "premonition error" >< div class = "fa fa-exclamation-triangle" ></ div >< div class = "content" >< p class = "header" > BETA FEATURE</ p >< p > Expect bad behavior and open < a href = "https://framagit.org/les/gancio/issues" > issues</ a ></ p >
</ div ></ div >
< h2 class = "no_toc" id = "oauth" > OAuth</ h2 >
2020-01-21 01:25:09 +01:00
< p > An open standard for token-based authentication and authorization on the Internet.</ p >
< p > Gancio supports OAuth 2.0, an authorization framework described in < a href = "https://tools.ietf.org/html/rfc6749" > RFC 6749</ a > that allows third-party applications to obtain limited access to an HTTP service on behalf of a resource owner, through the use of a standardized authorization flow that generates a client access token to be used with HTTP requests.</ p >
< p > To obtain an OAuth token for a Gancio instance, make sure that you allow your users to specify the domain they want to connect to before login. Use that domain to < a href = "#create-client" > acquire a client id/secret</ a > and then proceed with normal OAuth 2.</ p >
2020-01-21 22:14:46 +01:00
< hr />
2020-01-21 01:25:09 +01:00
< h2 id = "create-client" > Create client</ h2 >
< p > Create a new application to obtain OAuth2 credentials.</ p >
< p class = "label label-yellow" > POST</ p >
< p >< code class = "highlighter-rouge" > /api/client</ code ></ p >
< h4 id = "request-parameters" > Request parameters</ h4 >
< table >
< tbody >
< tr >
< td > client_name</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td > A name for your application</ td >
</ tr >
< tr >
2020-01-21 22:14:46 +01:00
< td > redirect_uris</ td >
2020-01-21 01:25:09 +01:00
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td > Where the user should be redirected after authorization</ td >
</ tr >
< tr >
< td > scopes</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
2020-01-21 22:14:46 +01:00
< td > Space separated list of scopes. If none is provided, defaults to < code class = "highlighter-rouge" > event:write</ code > as it’ s the only supported scope!</ td >
2020-01-21 01:25:09 +01:00
</ tr >
< tr >
< td > website</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td > A URL to the homepage of your app</ td >
</ tr >
</ tbody >
</ table >
< h4 id = "example" > Example</ h4 >
< div class = "language-bash highlighter-rouge" >< div class = "highlight" >< pre class = "highlight" >< code > curl < span class = "nt" > -X</ span > POST < span class = "se" > \</ span >
< span class = "nt" > -d</ span > < span class = "s1" > 'client_name=Wordpress Event Manager'</ span > < span class = "se" > \</ span >
2020-01-21 22:14:46 +01:00
< span class = "nt" > -d</ span > < span class = "s1" > 'redirect_uris=https://noblogs.org/'</ span > < span class = "se" > \</ span >
2020-01-21 01:25:09 +01:00
< span class = "nt" > -d</ span > < span class = "s1" > 'website=https://myapp.example'</ span > < span class = "se" > \</ span >
http://localhost:13120/api/client
</ code ></ pre ></ div ></ div >
< h4 id = "returns" > Returns</ h4 >
< p > Application, with < code class = "highlighter-rouge" > client_id</ code > and < code class = "highlighter-rouge" > client_secret</ code ></ p >
< div class = "language-json highlighter-rouge" >< div class = "highlight" >< pre class = "highlight" >< code >< span class = "p" > {</ span >< span class = "w" >
</ span >< span class = "s2" > "name"</ span >< span class = "w" > </ span >< span class = "p" > :</ span >< span class = "w" > </ span >< span class = "s2" > "Wordpress Event Manager"</ span >< span class = "p" > ,</ span >< span class = "w" >
2020-01-21 22:14:46 +01:00
</ span >< span class = "s2" > "scopes"</ span >< span class = "w" > </ span >< span class = "p" > :</ span >< span class = "w" > </ span >< span class = "s2" > "event:write"</ span >< span class = "p" > ,</ span >< span class = "w" >
2020-01-21 01:25:09 +01:00
</ span >< span class = "s2" > "website"</ span >< span class = "w" > </ span >< span class = "p" > :</ span >< span class = "w" > </ span >< span class = "s2" > "https://myapp.example"</ span >< span class = "p" > ,</ span >< span class = "w" >
</ span >< span class = "s2" > "client_secret"</ span >< span class = "w" > </ span >< span class = "p" > :</ span >< span class = "w" > </ span >< span class = "s2" > "909029fa12797e6bdfb5baf5e379675dfa4e3ad4"</ span >< span class = "p" > ,</ span >< span class = "w" >
2020-01-21 22:14:46 +01:00
</ span >< span class = "s2" > "redirect_uris"</ span >< span class = "w" > </ span >< span class = "p" > :</ span >< span class = "w" > </ span >< span class = "s2" > "https://noblogs.org"</ span >< span class = "p" > ,</ span >< span class = "w" >
2020-01-21 01:25:09 +01:00
</ span >< span class = "s2" > "client_id"</ span >< span class = "w" > </ span >< span class = "p" > :</ span >< span class = "w" > </ span >< span class = "s2" > "0f377e34b2aaf517f7db534f32d26b0dd938fb6d"</ span >< span class = "w" >
</ span >< span class = "p" > }</ span >< span class = "w" >
</ span ></ code ></ pre ></ div ></ div >
< h4 id = "list-of-scopes" > List of scopes</ h4 >
< ul >
2020-01-21 22:14:46 +01:00
< li >< code class = "highlighter-rouge" > event:write</ code >< br />
2020-01-21 01:25:09 +01:00
Grant access to add/update events.</ li >
</ ul >
< h2 id = "authorize-a-user" > Authorize a user</ h2 >
< p > Displays an authorization form to the user. If approved, it will create and return an authorization code, then redirect to the desired < code class = "highlighter-rouge" > redirect_uri</ code > .
The authorization code can be used while requesting a token to obtain access to user-level methods.</ p >
2020-01-21 22:36:32 +01:00
< p >< a href = "/assets/oauth_auth.png" data-fancybox = "group" data-caption = "OAuth authorization form" >< img src = "/assets/thumbs/oauth_auth.png" alt = "/assets/thumbs/oauth_auth.png" /></ a ></ p >
2020-01-21 22:14:46 +01:00
2020-01-21 01:25:09 +01:00
< p class = "label label-green" > GET</ p >
< p >< code class = "highlighter-rouge" > /authorize</ code ></ p >
< h4 id = "request-parameters-1" > Request parameters</ h4 >
< table >
< tbody >
< tr >
< td > response_type</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td > Should be set equal to < code class = "highlighter-rouge" > code</ code ></ td >
</ tr >
< tr >
< td > redirect_uri</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td > Where the user should be redirected after authorization</ td >
</ tr >
< tr >
< td > scope</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
2020-01-21 22:14:46 +01:00
< td > Should be < code class = "highlighter-rouge" > event:write</ code ></ td >
2020-01-21 01:25:09 +01:00
</ tr >
< tr >
< td > client_id</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
2020-01-21 22:14:46 +01:00
< td >< code class = "highlighter-rouge" > client_id</ code > , obtained during app registration.</ td >
</ tr >
</ tbody >
</ table >
< h2 id = "obtain-a-token" > Obtain a token</ h2 >
< p class = "label label-yellow" > POST</ p >
< p >< code class = "highlighter-rouge" > /oauth/token</ code ></ p >
< h4 id = "request-parameters-2" > Request parameters</ h4 >
< table >
< tbody >
< tr >
< td > client_id</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td >< code class = "highlighter-rouge" > client_id</ code > obtained during < a href = "#create-client" > client registration</ a ></ td >
</ tr >
< tr >
< td > client_secret</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td >< code class = "highlighter-rouge" > client_secret</ code > obtained during < a href = "#create-client" > client registration</ a ></ td >
</ tr >
< tr >
< td > scope</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td > Should be < code class = "highlighter-rouge" > event:write</ code ></ td >
</ tr >
< tr >
< td > grant_type</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td > Set equal to < code class = "highlighter-rouge" > authorization_code</ code ></ td >
</ tr >
< tr >
< td > code</ td >
< td >< code class = "highlighter-rouge" > string</ code ></ td >
< td > A user authorization code, obtained via < a href = "#authorize-a-user" > /authorize</ a ></ td >
2020-01-21 01:25:09 +01:00
</ tr >
</ tbody >
</ table >
</ div >
</ div >
</ div >
</ div >
</ body >
</ html >