[{"data":1,"prerenderedAt":367},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fauthorization":115,"\u002Fapi\u002Fauthorization-surround":362},[4,36,57,88,104],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":35},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Install","\u002Fgetting-started\u002Finstall","1.getting-started\u002F2.install","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F3.quickstart","i-lucide-zap",{"title":26,"path":27,"stem":28,"icon":29},"Testing","\u002Fgetting-started\u002Ftesting","1.getting-started\u002F4.testing","i-lucide-flask-conical",{"title":31,"path":32,"stem":33,"icon":34},"CLI","\u002Fgetting-started\u002Fcli","1.getting-started\u002F5.cli","i-lucide-terminal",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Concepts","i-lucide-boxes","\u002Fconcepts","2.concepts",[42,47,52],{"title":43,"path":44,"stem":45,"icon":46},"SQL-first contract","\u002Fconcepts\u002Fsql-first-contract","2.concepts\u002F1.sql-first-contract","i-lucide-database",{"title":48,"path":49,"stem":50,"icon":51},"Jobs and status","\u002Fconcepts\u002Fjobs-and-status","2.concepts\u002F2.jobs-and-status","i-lucide-list-checks",{"title":53,"path":54,"stem":55,"icon":56},"Fencing and settles","\u002Fconcepts\u002Ffencing-and-settles","2.concepts\u002F3.fencing-and-settles","i-lucide-shield",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":35},"API","i-lucide-code-2","\u002Fapi","3.api",[63,68,73,78,83],{"title":64,"path":65,"stem":66,"icon":67},"Enqueue","\u002Fapi\u002Fenqueue","3.api\u002F1.enqueue","i-lucide-plus-circle",{"title":69,"path":70,"stem":71,"icon":72},"Claim and heartbeat","\u002Fapi\u002Fclaim-and-heartbeat","3.api\u002F2.claim-and-heartbeat","i-lucide-hand",{"title":74,"path":75,"stem":76,"icon":77},"Worker and handlers","\u002Fapi\u002Fworker-and-handlers","3.api\u002F3.worker-and-handlers","i-lucide-cpu",{"title":79,"path":80,"stem":81,"icon":82},"HTTP facade","\u002Fapi\u002Fhttp-facade","3.api\u002F4.http-facade","i-lucide-globe",{"title":84,"path":85,"stem":86,"icon":87},"Authorization","\u002Fapi\u002Fauthorization","3.api\u002F5.authorization","i-lucide-key-round",{"title":89,"icon":90,"path":91,"stem":92,"children":93,"page":35},"Operations","i-lucide-activity","\u002Foperations","4.operations",[94,99],{"title":95,"path":96,"stem":97,"icon":98},"Housekeeping","\u002Foperations\u002Fhousekeeping","4.operations\u002F1.housekeeping","i-lucide-timer",{"title":100,"path":101,"stem":102,"icon":103},"Redrive and dead letters","\u002Foperations\u002Fredrive-and-dlq","4.operations\u002F2.redrive-and-dlq","i-lucide-rotate-ccw",{"title":105,"icon":106,"path":107,"stem":108,"children":109,"page":35},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[110],{"title":111,"path":112,"stem":113,"icon":114},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F1.configuration","i-lucide-settings",{"id":116,"title":84,"body":117,"description":355,"extension":356,"links":357,"meta":358,"navigation":359,"path":85,"seo":360,"stem":86,"__hash__":361},"docs\u002F3.api\u002F5.authorization.md",{"type":118,"value":119,"toc":350},"minimark",[120,141,146,182,186,222,225,278,282,325,340,346],[121,122,123,124,128,129,132,133,136,137,140],"p",{},"The HTTP facade never hard-depends on ",[125,126,127],"code",{},"outlabs-auth",". Hosts inject a ",[125,130,131],{},"QueueAuthorizer"," with separate ",[125,134,135],{},"authenticate"," and ",[125,138,139],{},"authorize_context"," phases.",[142,143,145],"h2",{"id":144},"built-in-authorizers","Built-in authorizers",[147,148,153],"pre",{"className":149,"code":150,"language":151,"meta":152,"style":152},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from taskq.http import bearer_token_auth, static_api_key_auth\n\nauthorizer = static_api_key_auth(\"lab-secret\")\n# or: bearer_token_auth(expected=\"…\")\n","python","",[125,154,155,163,170,176],{"__ignoreMap":152},[156,157,160],"span",{"class":158,"line":159},"line",1,[156,161,162],{},"from taskq.http import bearer_token_auth, static_api_key_auth\n",[156,164,166],{"class":158,"line":165},2,[156,167,169],{"emptyLinePlaceholder":168},true,"\n",[156,171,173],{"class":158,"line":172},3,[156,174,175],{},"authorizer = static_api_key_auth(\"lab-secret\")\n",[156,177,179],{"class":158,"line":178},4,[156,180,181],{},"# or: bearer_token_auth(expected=\"…\")\n",[142,183,185],{"id":184},"outlabs-adapter","OutLabs adapter",[147,187,189],{"className":149,"code":188,"language":151,"meta":152,"style":152},"from taskq.http.outlabs import OutlabsQueueAuthorizer\n\nauthorizer = OutlabsQueueAuthorizer(\n    auth=auth,  # initialized SimpleRBAC (or bind checker lazily after startup)\n    session_dependency=get_async_session,\n)\n",[125,190,191,196,200,205,210,216],{"__ignoreMap":152},[156,192,193],{"class":158,"line":159},[156,194,195],{},"from taskq.http.outlabs import OutlabsQueueAuthorizer\n",[156,197,198],{"class":158,"line":165},[156,199,169],{"emptyLinePlaceholder":168},[156,201,202],{"class":158,"line":172},[156,203,204],{},"authorizer = OutlabsQueueAuthorizer(\n",[156,206,207],{"class":158,"line":178},[156,208,209],{},"    auth=auth,  # initialized SimpleRBAC (or bind checker lazily after startup)\n",[156,211,213],{"class":158,"line":212},5,[156,214,215],{},"    session_dependency=get_async_session,\n",[156,217,219],{"class":158,"line":218},6,[156,220,221],{},")\n",[121,223,224],{},"Permission grammar:",[226,227,228,241],"table",{},[229,230,231],"thead",{},[232,233,234,238],"tr",{},[235,236,237],"th",{},"Pattern",[235,239,240],{},"Example",[242,243,244,265],"tbody",{},[232,245,246,250],{},[247,248,249],"td",{},"Global action",[247,251,252,255,256,255,259,255,262],{},[125,253,254],{},"taskq:enqueue",", ",[125,257,258],{},"taskq:read",[125,260,261],{},"taskq:run",[125,263,264],{},"taskq:control",[232,266,267,270],{},[247,268,269],{},"Per-queue action",[247,271,272,255,275],{},[125,273,274],{},"taskq_mail:run",[125,276,277],{},"taskq_courts:enqueue",[142,279,281],{"id":280},"provisioning","Provisioning",[147,283,287],{"className":284,"code":285,"language":286,"meta":152,"style":152},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","taskq auth sync-permissions --dsn \"$AUTH_DSN\" --queue mail --apply\n","bash",[125,288,289],{"__ignoreMap":152},[156,290,291,295,299,302,305,309,313,316,319,322],{"class":158,"line":159},[156,292,294],{"class":293},"sBMFI","taskq",[156,296,298],{"class":297},"sfazB"," auth",[156,300,301],{"class":297}," sync-permissions",[156,303,304],{"class":297}," --dsn",[156,306,308],{"class":307},"sMK4o"," \"",[156,310,312],{"class":311},"sTEyZ","$AUTH_DSN",[156,314,315],{"class":307},"\"",[156,317,318],{"class":297}," --queue",[156,320,321],{"class":297}," mail",[156,323,324],{"class":297}," --apply\n",[121,326,327,328,331,332,335,336,339],{},"Or call ",[125,329,330],{},"provision_taskq_auth"," \u002F ",[125,333,334],{},"taskq_permission_catalog"," from ",[125,337,338],{},"taskq.http.outlabs",".",[341,342,343],"note",{},[121,344,345],{},"Authorize mutations from authoritative row lookup — never from caller-supplied queue\u002Fjob_type alone (ADR-006).",[347,348,349],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":152,"searchDepth":159,"depth":165,"links":351},[352,353,354],{"id":144,"depth":165,"text":145},{"id":184,"depth":165,"text":185},{"id":280,"depth":165,"text":281},"QueueAuthorizer, built-ins, and the OutLabs adapter.","md",null,{},{"icon":87},{"title":84,"description":355},"yV9xcxDpHXLQWtPhDqYEE-eJrAS3wsGflZYk7C-t0F0",[363,365],{"title":79,"path":80,"stem":81,"description":364,"icon":82,"children":-1},"Optional FastAPI transport for no-DB-credential workers.",{"title":95,"path":96,"stem":97,"description":366,"icon":98,"children":-1},"Tick, reaper, and NOTIFY vs poll.",1784549300044]