{"result":{"depiction_url":null,"edges":{"in_module":{"objects":[{"created":"2026-09-30T09:18:25Z","object_id":{"id":1831,"is_a":["text","documentation","reference","module"],"name":"doc_module_mod_oauth2","title":"mod_oauth2","uri":"https:\/\/zotonic.com\/id\/1831"},"seq":1}],"predicate":{"id":333,"is_a":["meta","predicate"],"name":"in_module","title":{"_type":"trans","tr":{"en":"In module"}},"uri":"https:\/\/zotonic.com\/id\/in_module"}},"refers":{"objects":[{"created":"2026-09-30T09:32:49Z","object_id":{"id":2736,"is_a":["text","documentation","reference","cotonic_reference","cotonic_model"],"name":"doc_cotonic_model_location","title":"model\/location","uri":"https:\/\/zotonic.com\/id\/2736"},"seq":1000000},{"created":"2026-09-30T09:32:49Z","object_id":{"id":2741,"is_a":["text","documentation","reference","cotonic_reference","cotonic_model"],"name":"doc_cotonic_model_localstorage","title":"model\/localStorage","uri":"https:\/\/zotonic.com\/id\/2741"},"seq":1000000},{"created":"2026-09-30T09:32:49Z","object_id":{"id":2742,"is_a":["text","documentation","reference","cotonic_reference","cotonic_model"],"name":"doc_cotonic_model_sessionstorage","title":"model\/sessionStorage","uri":"https:\/\/zotonic.com\/id\/2742"},"seq":1000000},{"created":"2026-09-30T09:32:49Z","object_id":{"id":2743,"is_a":["text","documentation","reference","cotonic_reference","cotonic_model"],"name":"doc_cotonic_model_sessionid","title":"model\/sessionId","uri":"https:\/\/zotonic.com\/id\/2743"},"seq":1000000},{"created":"2026-09-30T09:32:49Z","object_id":{"id":2754,"is_a":["text","documentation","reference","cotonic_reference","cotonic_model"],"name":"doc_zotonic_cotonic_model_auth","title":"model\/auth","uri":"https:\/\/zotonic.com\/id\/2754"},"seq":1000000}],"predicate":{"id":2409,"is_a":["meta","predicate"],"name":"refers","title":{"_type":"trans","tr":{"en":"Refers"}},"uri":"https:\/\/zotonic.com\/id\/refers"}},"subject":{"objects":[{"created":"2026-09-30T09:18:25Z","object_id":{"id":2555,"is_a":["categorization","keyword","keyword_information_type"],"name":"zotonic_topic_reference","title":"Reference","uri":"https:\/\/zotonic.com\/id\/2555"},"seq":1},{"created":"2026-09-30T09:18:25Z","object_id":{"id":2563,"is_a":["categorization","keyword","keyword_audience"],"name":"zotonic_topic_frontend_developer","title":"Frontend developer","uri":"https:\/\/zotonic.com\/id\/2563"},"seq":2},{"created":"2026-09-30T09:18:25Z","object_id":{"id":2590,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_authentication","title":"Authentication","uri":"https:\/\/zotonic.com\/id\/2590"},"seq":3},{"created":"2026-09-30T09:18:25Z","object_id":{"id":2625,"is_a":["categorization","keyword","keyword_architecture"],"name":"zotonic_topic_model","title":"Model","uri":"https:\/\/zotonic.com\/id\/2625"},"seq":4},{"created":"2026-09-30T09:18:25Z","object_id":{"id":2673,"is_a":["categorization","keyword","keyword_technology"],"name":"zotonic_topic_javascript","title":"JavaScript","uri":"https:\/\/zotonic.com\/id\/2673"},"seq":5},{"created":"2026-09-30T09:18:25Z","object_id":{"id":2681,"is_a":["categorization","keyword","keyword_technology"],"name":"zotonic_topic_oauth_2_0","title":"OAuth 2.0","uri":"https:\/\/zotonic.com\/id\/2681"},"seq":6},{"created":"2026-09-30T09:18:25Z","object_id":{"id":2713,"is_a":["categorization","keyword","keyword_domain"],"name":"zotonic_topic_browser_storage","title":"Browser storage","uri":"https:\/\/zotonic.com\/id\/2713"},"seq":7},{"created":"2026-09-30T09:18:25Z","object_id":{"id":2718,"is_a":["categorization","keyword","keyword_technology"],"name":"zotonic_topic_cotonic","title":"Cotonic","uri":"https:\/\/zotonic.com\/id\/2718"},"seq":8}],"predicate":{"id":308,"is_a":["meta","predicate"],"name":"subject","title":{"_type":"trans","tr":{"en":"Keyword"}},"uri":"http:\/\/purl.org\/dc\/elements\/1.1\/subject"}}},"id":2748,"is_a":["text","documentation","reference","cotonic_reference","cotonic_model"],"links":[{"rel":"self","target":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/2748"},{"rel":"hub","target":"https:\/\/zotonic.com\/.zotonic\/websub"}],"medium":null,"medium_url":null,"name":"doc_zotonic_cotonic_model_oauth","page_url":{"en":"https:\/\/zotonic.com\/cotonic\/zotonic-models\/oauth","x-default":"https:\/\/zotonic.com\/cotonic\/zotonic-models\/oauth"},"preview_url":null,"resource":{"version":26,"pivot_location_lat":null,"title":"model\/oauth","is_authoritative":true,"body":"<h1>model\/oauth<\/h1>\n<p>Coordinates an OAuth authorization or redirect page. The worker is provided by\n<code>mod_oauth2<\/code> and advertises <code>model\/oauth<\/code> as a dependency capability. It has no\npublic <code>model\/oauth\/get\/...<\/code> or <code>model\/oauth\/post\/...<\/code> subscriptions.<\/p>\n<h2>Initialization<\/h2>\n<p>The standard <code>logon_service_oauth.tpl<\/code> and <code>logon_service_oauth_done.tpl<\/code> templates\nstart <code>js\/zotonic.oauth.worker.js<\/code> with server-generated <code>worker_args<\/code>.<\/p>\n<table class=\"table\"><thead><tr><th>Argument<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>oauth_step<\/code><\/td><td><code>&quot;authorize&quot;<\/code> or <code>&quot;redirect&quot;<\/code>.<\/td><\/tr><tr><td><code>authorize_url<\/code><\/td><td>Provider authorization URL for the authorize step.<\/td><\/tr><tr><td><code>oauth_state<\/code><\/td><td>State data stored for the authorize step.<\/td><\/tr><tr><td><code>oauth_state_id<\/code><\/td><td>Identifier associated with that state.<\/td><\/tr><\/tbody><\/table>\n<p>Use the standard OAuth service login flow to obtain these arguments. The worker\ndepends on <code>bridge\/origin<\/code>, <a href=\"\/id\/doc_zotonic_cotonic_model_auth\" class=\"doc-reference doc-reference-cotonic\"><code>cotonic#auth<\/code><\/a>, <a href=\"\/id\/doc_cotonic_model_sessionid\" class=\"doc-reference doc-reference-cotonic\"><code>cotonic#sessionId<\/code><\/a>, <a href=\"\/id\/doc_cotonic_model_location\" class=\"doc-reference doc-reference-cotonic\"><code>cotonic#location<\/code><\/a>,\n<a href=\"\/id\/doc_cotonic_model_sessionstorage\" class=\"doc-reference doc-reference-cotonic\"><code>cotonic#sessionStorage<\/code><\/a>, and <a href=\"\/id\/doc_cotonic_model_localstorage\" class=\"doc-reference doc-reference-cotonic\"><code>cotonic#localStorage<\/code><\/a>.<\/p>\n<h2>Flow and messages<\/h2>\n<p>The worker waits for a stable <code>model\/auth\/event\/auth<\/code> state. During authorization\nit stores temporary <code>oauth-data<\/code> in localStorage and redirects to the provider.\nDuring the redirect step it coordinates a page reload, reads the callback query\nparameters, and calls\n<code>bridge\/origin\/model\/oauth2_service\/post\/oauth-redirect<\/code>.<\/p>\n<p>Depending on the server response, it can submit an onetime token to\n<code>model\/auth\/post\/onetime-token<\/code>, request account confirmation through\n<code>bridge\/opener\/model\/auth-ui\/post\/confirm-authuser<\/code>, redirect the browser, close\nthe window, or render an error view. It also listens to\n<code>model\/auth\/event\/auth-user-id<\/code> and <code>model\/auth\/event\/service-confirm<\/code>.<\/p>\n<p>This worker does not expose a general request\/reply API or publish its own\n<code>model\/oauth\/event\/...<\/code> status stream. Its UI and authentication effects are\nhandled through the other models.<\/p>\n<h2>Implementation<\/h2>\n<p><a href=\"https:\/\/github.com\/zotonic\/zotonic\/blob\/master\/apps\/zotonic_mod_oauth2\/priv\/lib\/js\/zotonic.oauth.worker.js\">JavaScript source<\/a>.<\/p>","slug":"model-oauth","is_protected":false,"visible_for":0,"tz":"UTC","language":["en"],"doc_source_hash":"7d31ce6c774aa4381e685de0363dea712fbc8fae69016ee372da6c3262bd8cf1","is_featured":false,"content_group_id":{"id":2551,"is_a":["meta","content_group"],"name":"content_group_imported_docs","title":"Imported documentation","uri":"https:\/\/zotonic.com\/id\/content_group_imported_docs"},"category_id":{"id":2723,"is_a":["meta","category"],"name":"cotonic_model","title":"Cotonic models","uri":"https:\/\/zotonic.com\/id\/cotonic_model"},"doc_source_path":"doc\/cotonic-models\/oauth.md","publication_start":"2026-09-30T09:18:25Z","page_path":"\/cotonic\/zotonic-models\/oauth","github_url":"https:\/\/github.com\/zotonic\/zotonic\/blob\/master\/doc\/cotonic-models\/oauth.md","pivot_location_lng":null,"doc_source_kind":"cotonic_model","name":"doc_zotonic_cotonic_model_oauth","is_unfindable":false,"is_published":true,"pivot_geocode":null,"created":"2026-09-30T09:18:25Z","uri":null,"doc_status":"current","is_dependent":false,"publication_end":"9999-06-01T00:00:00Z","modifier_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"privacy":0,"doc_source_commit":"b8c4b2ccdc223257f311968fbd17b2d66f0c4156\n","creator_id":{"id":1,"is_a":["person"],"name":"administrator","title":"Site Administrator","uri":"https:\/\/zotonic.com\/id\/1"},"modified":"2026-09-30T09:40:08Z","title_slug":"model-oauth"},"uri":"https:\/\/zotonic.com\/id\/2748","uri_template":"https:\/\/zotonic.com\/id\/:id","websub":{"hub":"https:\/\/zotonic.com\/.zotonic\/websub","topic":"https:\/\/zotonic.com\/.zotonic\/websub\/topic\/2748"}},"status":"ok"}