[{"data":1,"prerenderedAt":723},["ShallowReactive",2],{"navigation":3,"\u002Fauth\u002Fsessions-and-audit":189,"\u002Fauth\u002Fsessions-and-audit-surround":718},[4,34,60,116,137,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":33},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,18,23,28],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-house",{"title":5,"path":16,"stem":17,"icon":6},"\u002Fgetting-started\u002Fgetting-started","1.getting-started\u002F2.getting-started",{"title":19,"path":20,"stem":21,"icon":22},"Choosing a Preset","\u002Fgetting-started\u002Fchoosing-a-preset","1.getting-started\u002F3.choosing-a-preset","i-lucide-git-branch",{"title":24,"path":25,"stem":26,"icon":27},"Deployment","\u002Fgetting-started\u002Fdeployment","1.getting-started\u002F4.deployment","i-lucide-cloud",{"title":29,"path":30,"stem":31,"icon":32},"Background Maintenance","\u002Fgetting-started\u002Fbackground-maintenance","1.getting-started\u002F5.background-maintenance","i-lucide-timer-reset",false,{"title":35,"icon":36,"path":37,"stem":38,"children":39,"page":33},"Build","i-lucide-wrench","\u002Fbuild","2.build",[40,45,50,55],{"title":41,"path":42,"stem":43,"icon":44},"Routers & Prefixes","\u002Fbuild\u002Frouters-and-prefixes","2.build\u002F1.routers-and-prefixes","i-lucide-route",{"title":46,"path":47,"stem":48,"icon":49},"Configuration","\u002Fbuild\u002Fconfiguration","2.build\u002F2.configuration","i-lucide-settings",{"title":51,"path":52,"stem":53,"icon":54},"Authorization Dependencies","\u002Fbuild\u002Fauthorization-dependencies","2.build\u002F3.authorization-dependencies","i-lucide-shield-check",{"title":56,"path":57,"stem":58,"icon":59},"Command Line","\u002Fbuild\u002Fcli","2.build\u002F4.cli","i-lucide-terminal",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":33},"Auth","i-lucide-lock","\u002Fauth","3.auth",[66,71,76,81,86,91,96,101,106,111],{"title":67,"path":68,"stem":69,"icon":70},"OAuth & Social Login","\u002Fauth\u002Foauth-and-social-login","3.auth\u002F1.oauth-and-social-login","i-lucide-log-in",{"title":72,"path":73,"stem":74,"icon":75},"Multi-Frontend Support","\u002Fauth\u002Fmulti-frontend","3.auth\u002F10.multi-frontend","i-lucide-layout-grid",{"title":77,"path":78,"stem":79,"icon":80},"Sessions & Audit","\u002Fauth\u002Fsessions-and-audit","3.auth\u002F2.sessions-and-audit","i-lucide-monitor-smartphone",{"title":82,"path":83,"stem":84,"icon":85},"Passwordless & Messaging","\u002Fauth\u002Fpasswordless-and-messaging","3.auth\u002F3.passwordless-and-messaging","i-lucide-mail",{"title":87,"path":88,"stem":89,"icon":90},"JWT Tokens","\u002Fauth\u002Fjwt-tokens","3.auth\u002F4.jwt-tokens","i-lucide-key-round",{"title":92,"path":93,"stem":94,"icon":95},"User Management API","\u002Fauth\u002Fuser-management-api","3.auth\u002F5.user-management-api","i-lucide-users",{"title":97,"path":98,"stem":99,"icon":100},"User Invitations","\u002Fauth\u002Fuser-invitations","3.auth\u002F6.user-invitations","i-lucide-send",{"title":102,"path":103,"stem":104,"icon":105},"Roles & Permissions","\u002Fauth\u002Froles-and-permissions","3.auth\u002F7.roles-and-permissions","i-lucide-shield",{"title":107,"path":108,"stem":109,"icon":110},"ABAC","\u002Fauth\u002Fabac","3.auth\u002F8.abac","i-lucide-filter",{"title":112,"path":113,"stem":114,"icon":115},"User Status","\u002Fauth\u002Fuser-status","3.auth\u002F9.user-status","i-lucide-user-cog",{"title":117,"icon":118,"path":119,"stem":120,"children":121,"page":33},"Enterprise","i-lucide-building-2","\u002Fenterprise","4.enterprise",[122,127,132],{"title":123,"path":124,"stem":125,"icon":126},"Core Authorization Concepts","\u002Fenterprise\u002Fcore-authorization-concepts","4.enterprise\u002F1.core-authorization-concepts","i-lucide-network",{"title":128,"path":129,"stem":130,"icon":131},"Entities","\u002Fenterprise\u002Fentities","4.enterprise\u002F2.entities","i-lucide-folder-tree",{"title":133,"path":134,"stem":135,"icon":136},"Entity Memberships","\u002Fenterprise\u002Fentity-memberships","4.enterprise\u002F3.entity-memberships","i-lucide-user-plus",{"title":138,"icon":139,"path":140,"stem":141,"children":142,"page":33},"Integrations","i-lucide-plug","\u002Fintegrations","5.integrations",[143,148],{"title":144,"path":145,"stem":146,"icon":147},"API Keys","\u002Fintegrations\u002Fapi-keys","5.integrations\u002F1.api-keys","i-lucide-key",{"title":149,"path":150,"stem":151,"icon":152},"OutlabsAuth UI","\u002Fintegrations\u002Foutlabsauth-ui","5.integrations\u002F2.outlabsauth-ui","i-lucide-layout-dashboard",{"title":154,"icon":155,"path":156,"stem":157,"children":158,"page":33},"Reference","i-lucide-book-marked","\u002Freference","6.reference",[159,164,169,174,179,184],{"title":160,"path":161,"stem":162,"icon":163},"Data Models","\u002Freference\u002Fdata-models","6.reference\u002F1.data-models","i-lucide-database",{"title":165,"path":166,"stem":167,"icon":168},"Activity Tracking","\u002Freference\u002Factivity-tracking","6.reference\u002F2.activity-tracking","i-lucide-activity",{"title":170,"path":171,"stem":172,"icon":173},"Testing","\u002Freference\u002Ftesting","6.reference\u002F3.testing","i-lucide-flask-conical",{"title":175,"path":176,"stem":177,"icon":178},"Observability","\u002Freference\u002Fobservability","6.reference\u002F4.observability","i-lucide-eye",{"title":180,"path":181,"stem":182,"icon":183},"Metrics Reference","\u002Freference\u002Fmetrics-reference","6.reference\u002F5.metrics-reference","i-lucide-chart-bar",{"title":185,"path":186,"stem":187,"icon":188},"Log Events Reference","\u002Freference\u002Flog-events-reference","6.reference\u002F6.log-events-reference","i-lucide-scroll-text",{"id":190,"title":77,"body":191,"description":711,"extension":712,"links":713,"meta":714,"navigation":715,"path":78,"seo":716,"stem":79,"__hash__":717},"docs\u002F3.auth\u002F2.sessions-and-audit.md",{"type":192,"value":193,"toc":697},"minimark",[194,216,221,232,239,269,274,340,374,388,392,453,460,467,488,492,503,517,521,550,560,564,583,612,635,642,648,651,663,667,693],[195,196,197,198,202,203,206,207,211,212,215],"p",{},"Let users (and admins) see ",[199,200,201],"strong",{},"active devices \u002F logins"," and search ",[199,204,205],{},"audit\nevents",". Mount ",[208,209,210],"code",{},"get_users_router"," for sessions and per-user history; mount\n",[208,213,214],{},"get_audit_router"," when you need cross-user search.",[217,218,220],"h2",{"id":219},"sessions-active-logins","Sessions (active logins)",[195,222,223,224,227,228,231],{},"Under the hood, a “session” is a stored refresh-token row\n(",[208,225,226],{},"store_refresh_tokens=True",", the default). The users router lists those rows as\nsessions ",[199,229,230],{},"without"," returning secrets.",[195,233,234,235,238],{},"Mount users (examples use ",[208,236,237],{},"\u002Fv1\u002Fusers","):",[240,241,246],"pre",{"className":242,"code":243,"language":244,"meta":245,"style":245},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from outlabs_auth.routers import get_users_router\n\napp.include_router(get_users_router(auth, prefix=\"\u002Fv1\u002Fusers\"))\n","python","",[208,247,248,256,263],{"__ignoreMap":245},[249,250,253],"span",{"class":251,"line":252},"line",1,[249,254,255],{},"from outlabs_auth.routers import get_users_router\n",[249,257,259],{"class":251,"line":258},2,[249,260,262],{"emptyLinePlaceholder":261},true,"\n",[249,264,266],{"class":251,"line":265},3,[249,267,268],{},"app.include_router(get_users_router(auth, prefix=\"\u002Fv1\u002Fusers\"))\n",[270,271,273],"h3",{"id":272},"self-service","Self-service",[275,276,277,293],"table",{},[278,279,280],"thead",{},[281,282,283,287,290],"tr",{},[284,285,286],"th",{},"Method",[284,288,289],{},"Path",[284,291,292],{},"Permission",[294,295,296,312,327],"tbody",{},[281,297,298,304,309],{},[299,300,301],"td",{},[208,302,303],{},"GET",[299,305,306],{},[208,307,308],{},"\u002Fv1\u002Fusers\u002Fme\u002Fsessions",[299,310,311],{},"Authenticated",[281,313,314,319,324],{},[299,315,316],{},[208,317,318],{},"DELETE",[299,320,321],{},[208,322,323],{},"\u002Fv1\u002Fusers\u002Fme\u002Fsessions\u002F{session_id}",[299,325,326],{},"Authenticated (own session)",[281,328,329,333,337],{},[299,330,331],{},[208,332,318],{},[299,334,335],{},[208,336,308],{},[299,338,339],{},"Authenticated — revoke all",[195,341,342,343,346,347,350,351,350,354,357,358,350,361,350,364,350,367,350,370,373],{},"Response fields (see ",[208,344,345],{},"UserSessionResponse","): ",[208,348,349],{},"id",", ",[208,352,353],{},"device_name",[208,355,356],{},"ip_address",",\n",[208,359,360],{},"user_agent",[208,362,363],{},"created_at",[208,365,366],{},"last_used_at",[208,368,369],{},"expires_at",[208,371,372],{},"usage_count",".",[195,375,376,377,380,381,384,385,373],{},"With frontend profiles configured (",[208,378,379],{},"0.1.0a25+","), sessions also record which\nfrontend minted them as an ",[208,382,383],{},"azp"," claim — preserved and re-validated at refresh\nrotation. See ",[386,387,72],"a",{"href":73},[270,389,391],{"id":390},"admin","Admin",[275,393,394,404],{},[278,395,396],{},[281,397,398,400,402],{},[284,399,286],{},[284,401,289],{},[284,403,292],{},[294,405,406,422,438],{},[281,407,408,412,417],{},[299,409,410],{},[208,411,303],{},[299,413,414],{},[208,415,416],{},"\u002Fv1\u002Fusers\u002F{user_id}\u002Fsessions",[299,418,419],{},[208,420,421],{},"user:read",[281,423,424,428,433],{},[299,425,426],{},[208,427,318],{},[299,429,430],{},[208,431,432],{},"\u002Fv1\u002Fusers\u002F{user_id}\u002Fsessions\u002F{session_id}",[299,434,435],{},[208,436,437],{},"user:update",[281,439,440,444,448],{},[299,441,442],{},[208,443,318],{},[299,445,446],{},[208,447,416],{},[299,449,450,452],{},[208,451,437],{}," (all for that user)",[195,454,455,456,459],{},"Scoped actors (Enterprise + ",[208,457,458],{},"enforce_user_scope",") only see targets in their\naccess scope. Admin revokes emit audit events when audit is wired.",[270,461,463,464],{"id":462},"do-not-confuse-with-get_session_router","Do not confuse with ",[208,465,466],{},"get_session_router",[195,468,469,471,472,475,476,480,481,484,485,487],{},[208,470,466],{}," is a ",[199,473,474],{},"minimal login\u002Frefresh\u002Flogout"," surface for embedded\nhosts — not the session ",[477,478,479],"em",{},"inventory"," API. Prefer ",[208,482,483],{},"get_auth_router"," for full auth\nplus ",[208,486,210],{}," for session list\u002Frevoke.",[217,489,491],{"id":490},"audit-events","Audit events",[195,493,494,495,498,499,502],{},"User-centric audit is driven by ",[208,496,497],{},"user_audit_service",", which is created during\n",[208,500,501],{},"auth.initialize()"," (always available after init). Mount the routers below to\nexpose it over HTTP.",[195,504,505,508,509,512,513,516],{},[208,506,507],{},"enable_audit_log"," on ",[208,510,511],{},"AuthConfig"," is a separate\u002Flegacy feature-status flag — it\ndoes ",[199,514,515],{},"not"," gate these routes.",[270,518,520],{"id":519},"per-user-history","Per-user history",[275,522,523,533],{},[278,524,525],{},[281,526,527,529,531],{},[284,528,286],{},[284,530,289],{},[284,532,292],{},[294,534,535],{},[281,536,537,541,546],{},[299,538,539],{},[208,540,303],{},[299,542,543],{},[208,544,545],{},"\u002Fv1\u002Fusers\u002F{user_id}\u002Faudit-events",[299,547,548],{},[208,549,421],{},[195,551,552,553,350,556,559],{},"Supports filters such as ",[208,554,555],{},"category",[208,557,558],{},"event_type",", pagination.",[270,561,563],{"id":562},"cross-user-search","Cross-user search",[240,565,567],{"className":242,"code":566,"language":244,"meta":245,"style":245},"from outlabs_auth.routers import get_audit_router\n\napp.include_router(get_audit_router(auth, prefix=\"\u002Fv1\u002Faudit-events\"))\n",[208,568,569,574,578],{"__ignoreMap":245},[249,570,571],{"class":251,"line":252},[249,572,573],{},"from outlabs_auth.routers import get_audit_router\n",[249,575,576],{"class":251,"line":258},[249,577,262],{"emptyLinePlaceholder":261},[249,579,580],{"class":251,"line":265},[249,581,582],{},"app.include_router(get_audit_router(auth, prefix=\"\u002Fv1\u002Faudit-events\"))\n",[275,584,585,595],{},[278,586,587],{},[281,588,589,591,593],{},[284,590,286],{},[284,592,289],{},[284,594,292],{},[294,596,597],{},[281,598,599,603,608],{},[299,600,601],{},[208,602,303],{},[299,604,605],{},[208,606,607],{},"\u002Fv1\u002Faudit-events",[299,609,610],{},[208,611,421],{},[195,613,614,615,350,617,350,619,357,622,350,625,350,628,350,631,634],{},"Query params include ",[208,616,555],{},[208,618,558],{},[208,620,621],{},"subject_user_id",[208,623,624],{},"actor_user_id",[208,626,627],{},"entity_id",[208,629,630],{},"occurred_from",[208,632,633],{},"occurred_to",", plus pagination.",[195,636,637,638,641],{},"Scoped Enterprise actors only receive events whose ",[208,639,640],{},"root_entity_id"," is in their\naccess scope. Global\u002Fsuperuser actors see the wider set according to scope\nresolution.",[195,643,644,645,647],{},"If ",[208,646,497],{}," is not available, search returns an empty page rather\nthan failing hard.",[217,649,149],{"id":650},"outlabsauth-ui",[195,652,653,654,657,658,373],{},"With users (+ audit) routers mounted under the same ",[208,655,656],{},"authApiPrefix",", the sister\nadmin console can show session and audit surfaces that the backend advertises.\nPoint the UI as described in ",[386,659,660],{"href":150},[208,661,662],{},"docs\u002FAUTH_UI.md",[217,664,666],{"id":665},"related","Related",[668,669,670,676,681,686],"ul",{},[671,672,673],"li",{},[386,674,675],{"href":42},"02-Routers-and-Prefixes.md",[671,677,678],{},[386,679,680],{"href":47},"03-Configuration.md",[671,682,683],{},[386,684,685],{"href":88},"22-JWT-Tokens.md",[671,687,688,689,692],{},"Live OpenAPI on a running example (",[208,690,691],{},"\u002Fdocs",")",[694,695,696],"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);}",{"title":245,"searchDepth":252,"depth":258,"links":698},[699,705,709,710],{"id":219,"depth":258,"text":220,"children":700},[701,702,703],{"id":272,"depth":265,"text":273},{"id":390,"depth":265,"text":391},{"id":462,"depth":265,"text":704},"Do not confuse with get_session_router",{"id":490,"depth":258,"text":491,"children":706},[707,708],{"id":519,"depth":265,"text":520},{"id":562,"depth":265,"text":563},{"id":650,"depth":258,"text":149},{"id":665,"depth":258,"text":666},"Active sessions and user audit search.","md",null,{},{"icon":80},{"title":77,"description":711},"aFZbAtQJDZHB7TsiGgYmr-on7jXLNC6l2VqiSqwiclM",[719,721],{"title":72,"path":73,"stem":74,"description":720,"icon":75,"children":-1},"One mount, several first-party frontends — profiles, resolution, and sign-in gating.",{"title":82,"path":83,"stem":84,"description":722,"icon":85,"children":-1},"Magic links, access codes, and host-owned delivery.",1787472744721]