[{"data":1,"prerenderedAt":2307},["ShallowReactive",2],{"navigation_docs":3,"-auth-providers":49,"-auth-providers-surround":2302},[4,9,14,19,24,29,34,39,44],{"title":5,"path":6,"stem":7,"icon":8},"Introduction","\u002Fintroduction","1.introduction","i-lucide-monitor",{"title":10,"path":11,"stem":12,"icon":13},"Setup","\u002Fsetup","2.setup","i-lucide-play",{"title":15,"path":16,"stem":17,"icon":18},"Git Providers","\u002Fgit-providers","3.git-providers","i-lucide-git-branch",{"title":20,"path":21,"stem":22,"icon":23},"Auth Providers","\u002Fauth-providers","4.auth-providers","i-lucide-shield-check",{"title":25,"path":26,"stem":27,"icon":28},"Content Editors","\u002Fcontent","5.content","i-lucide-pen-tool",{"title":30,"path":31,"stem":32,"icon":33},"Media Library","\u002Fmedias","6.medias","i-lucide-image",{"title":35,"path":36,"stem":37,"icon":38},"AI Features","\u002Fai","7.ai","i-lucide-sparkles",{"title":40,"path":41,"stem":42,"icon":43},"Roadmap","\u002Froadmap","8.roadmap","i-lucide-map",{"title":45,"path":46,"stem":47,"icon":48},"Advanced","\u002Fadvanced","9.advanced","i-lucide-settings",{"id":50,"title":20,"body":51,"description":2293,"extension":2294,"links":2295,"meta":2296,"navigation":2297,"path":21,"seo":2298,"stem":22,"__hash__":2301},"docs\u002F4.auth-providers.md",{"type":52,"value":53,"toc":2271},"minimark",[54,63,72,77,188,191,195,204,209,212,396,400,403,546,550,553,765,768,777,782,814,898,901,905,908,916,920,923,962,968,972,1003,1007,1014,1100,1104,1514,1518,1619,1623,1630,1662,1666,1670,1677,1731,1734,1738,1794,1797,1801,1804,1862,1865,1869,1872,1878,1881,1886,1928,1933,2083,2089,2092,2096,2135,2139,2267],[55,56,57,58,62],"p",{},"Auth providers handle ",[59,60,61],"strong",{},"user authentication"," and access control for Studio. They determine who can log in and edit content.",[64,65,66,67,71],"note",{},"Auth providers are different from ",[68,69,70],"a",{"href":16},"Git providers",". Auth providers handle user authentication, while Git providers handle repository operations.",[73,74,76],"h2",{"id":75},"provider-comparison","Provider Comparison",[78,79,80,105],"table",{},[81,82,83],"thead",{},[84,85,86,90,93,96,99,102],"tr",{},[87,88,89],"th",{},"Feature",[87,91,92],{},"GitHub OAuth",[87,94,95],{},"GitLab OAuth",[87,97,98],{},"Google OAuth",[87,100,101],{},"SSO Server",[87,103,104],{},"Custom Auth",[106,107,108,127,147,168],"tbody",{},[84,109,110,116,119,121,123,125],{},[111,112,113],"td",{},[59,114,115],{},"Authentication",[111,117,118],{},"✅",[111,120,118],{},[111,122,118],{},[111,124,118],{},[111,126,118],{},[84,128,129,134,137,139,142,145],{},[111,130,131],{},[59,132,133],{},"Git Operations",[111,135,136],{},"✅ Automatic (OAuth token)",[111,138,136],{},[111,140,141],{},"⚠ Requires PAT",[111,143,144],{},"✅ Automatic (SSO token)",[111,146,141],{},[84,148,149,154,157,159,162,165],{},[111,150,151],{},[59,152,153],{},"Access Control",[111,155,156],{},"✅ OAuth scope",[111,158,156],{},[111,160,161],{},"⚠ Moderator whitelist",[111,163,164],{},"✅ SSO server",[111,166,167],{},"⚠ Custom logic",[84,169,170,175,178,180,182,185],{},[111,171,172],{},[59,173,174],{},"Secured Auth Flow",[111,176,177],{},"✅ Provider-managed",[111,179,177],{},[111,181,177],{},[111,183,184],{},"✅ SSO-managed",[111,186,187],{},"⚠ Self-managed",[64,189,190],{},"You can use multiple providers simultaneously. For example, use GitHub OAuth for developers and Google OAuth for non-technical content editors.",[73,192,194],{"id":193},"built-in-providers","Built-in Providers",[196,197,198,199,203],"tip",{},"Once deployed with the appropriate credentials set as environment variables, Studio will be accessible from your production instance. Navigate to ",[200,201,202],"code",{},"\u002F_studio"," (or your configured route) to start editing and publishing content.",[205,206,208],"h3",{"id":207},"github","GitHub",[55,210,211],{},"GitHub OAuth provides authentication with automatic Git access. Users who authenticate via GitHub can immediately push changes to the repository.",[213,214,216,221,234,238,241,268,274,278,281,300,304,311],"steps",{"level":215},"4",[217,218,220],"h4",{"id":219},"navigate-to-github-developer-settings","Navigate to GitHub Developer Settings",[55,222,223,224,230,231],{},"Go to ",[68,225,229],{"href":226,"rel":227},"https:\u002F\u002Fgithub.com\u002Fsettings\u002Fdevelopers",[228],"nofollow","GitHub Developer Settings"," and click ",[59,232,233],{},"New OAuth App",[217,235,237],{"id":236},"configure-the-github-oauth-application","Configure the GitHub OAuth Application",[55,239,240],{},"Fill in the required fields:",[242,243,244,251,260],"ul",{},[245,246,247,250],"li",{},[59,248,249],{},"Application name",": Your app name",[245,252,253,256,257],{},[59,254,255],{},"Homepage URL",": ",[200,258,259],{},"https:\u002F\u002Fyourdomain.com",[245,261,262,256,265],{},[59,263,264],{},"Authorization callback URL",[200,266,267],{},"https:\u002F\u002Fyourdomain.com\u002F__nuxt_studio\u002Fauth\u002Fgithub",[64,269,270,271],{},"For local development, add: ",[200,272,273],{},"http:\u002F\u002Flocalhost:3000\u002F__nuxt_studio\u002Fauth\u002Fgithub",[217,275,277],{"id":276},"copy-your-github-credentials","Copy Your GitHub Credentials",[55,279,280],{},"After creating the OAuth app, you'll receive:",[242,282,283,290],{},[245,284,285,286,289],{},"A ",[59,287,288],{},"Client ID"," (visible immediately)",[245,291,285,292,295,296,299],{},[59,293,294],{},"Client Secret"," (click ",[59,297,298],{},"Generate a new client secret",")",[217,301,303],{"id":302},"set-github-environment-variables","Set GitHub Environment Variables",[55,305,306,307,310],{},"Add the GitHub OAuth credentials to your deployment platform's environment variables or ",[200,308,309],{},".env"," file:",[312,313,318],"pre",{"className":314,"code":315,"filename":309,"language":316,"meta":317,"style":317},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","STUDIO_GITHUB_CLIENT_ID=\u003Cyour_github_client_id>\nSTUDIO_GITHUB_CLIENT_SECRET=\u003Cyour_github_client_secret>\n\n# Optional: Restrict access to specific users\n# STUDIO_GITHUB_MODERATORS=admin@example.com,editor@example.com\n\n# Optional: GitHub entreprise server\nSTUDIO_GITHUB_INSTANCE_URL=https:\u002F\u002Fgh-ent.com\n","bash","",[200,319,320,340,353,360,367,373,378,384],{"__ignoreMap":317},[321,322,325,329,333,337],"span",{"class":323,"line":324},"line",1,[321,326,328],{"class":327},"sTEyZ","STUDIO_GITHUB_CLIENT_ID",[321,330,332],{"class":331},"sMK4o","=\u003C",[321,334,336],{"class":335},"sfazB","your_github_client_id",[321,338,339],{"class":331},">\n",[321,341,343,346,348,351],{"class":323,"line":342},2,[321,344,345],{"class":327},"STUDIO_GITHUB_CLIENT_SECRET",[321,347,332],{"class":331},[321,349,350],{"class":335},"your_github_client_secret",[321,352,339],{"class":331},[321,354,356],{"class":323,"line":355},3,[321,357,359],{"emptyLinePlaceholder":358},true,"\n",[321,361,363],{"class":323,"line":362},4,[321,364,366],{"class":365},"sHwdD","# Optional: Restrict access to specific users\n",[321,368,370],{"class":323,"line":369},5,[321,371,372],{"class":365},"# STUDIO_GITHUB_MODERATORS=admin@example.com,editor@example.com\n",[321,374,376],{"class":323,"line":375},6,[321,377,359],{"emptyLinePlaceholder":358},[321,379,381],{"class":323,"line":380},7,[321,382,383],{"class":365},"# Optional: GitHub entreprise server\n",[321,385,387,390,393],{"class":323,"line":386},8,[321,388,389],{"class":327},"STUDIO_GITHUB_INSTANCE_URL",[321,391,392],{"class":331},"=",[321,394,395],{"class":335},"https:\u002F\u002Fgh-ent.com\n",[205,397,399],{"id":398},"gitlab","GitLab",[55,401,402],{},"GitLab OAuth provides authentication with automatic Git access. Users who authenticate via GitLab can immediately push changes to the repository.",[213,404,405,409,422,426,428,452,457,461,464,477,481,486],{"level":215},[217,406,408],{"id":407},"navigate-to-gitlab-applications","Navigate to GitLab Applications",[55,410,411,412,417,418,421],{},"Go to your GitLab ",[68,413,416],{"href":414,"rel":415},"https:\u002F\u002Fgitlab.com\u002F-\u002Fuser_settings\u002Fapplications",[228],"User Settings → Applications"," (or your group\u002Forganization settings) and create a ",[59,419,420],{},"New Application",".",[217,423,425],{"id":424},"configure-the-gitlab-oauth-application","Configure the GitLab OAuth Application",[55,427,240],{},[242,429,430,434,442],{},[245,431,432,250],{},[59,433,249],{},[245,435,436,256,439],{},[59,437,438],{},"Redirect URI",[200,440,441],{},"https:\u002F\u002Fyourdomain.com\u002F__nuxt_studio\u002Fauth\u002Fgitlab",[245,443,444,447,448,451],{},[59,445,446],{},"Scopes",": Select ",[200,449,450],{},"api"," (required for publication)",[64,453,270,454],{},[200,455,456],{},"http:\u002F\u002Flocalhost:3000\u002F__nuxt_studio\u002Fauth\u002Fgitlab",[217,458,460],{"id":459},"copy-your-gitlab-credentials","Copy Your GitLab Credentials",[55,462,463],{},"After creating the OAuth application, you'll receive:",[242,465,466,472],{},[245,467,468,469,289],{},"An ",[59,470,471],{},"Application ID",[245,473,285,474,289],{},[59,475,476],{},"Secret",[217,478,480],{"id":479},"set-gitlab-environment-variables","Set GitLab Environment Variables",[55,482,483,484,310],{},"Add the GitLab OAuth credentials to your deployment platform's environment variables or ",[200,485,309],{},[312,487,489],{"className":314,"code":488,"filename":309,"language":316,"meta":317,"style":317},"STUDIO_GITLAB_APPLICATION_ID=\u003Cyour_gitlab_application_id>\nSTUDIO_GITLAB_APPLICATION_SECRET=\u003Cyour_gitlab_secret>\n\n# Optional: Restrict access to specific users\n# STUDIO_GITLAB_MODERATORS=admin@example.com,editor@example.com\n\n# Optional: Self hosted GitLab server\nSTUDIO_GITLAB_INSTANCE_URL=https:\u002F\u002Fgh-ent.com\n",[200,490,491,503,515,519,523,528,532,537],{"__ignoreMap":317},[321,492,493,496,498,501],{"class":323,"line":324},[321,494,495],{"class":327},"STUDIO_GITLAB_APPLICATION_ID",[321,497,332],{"class":331},[321,499,500],{"class":335},"your_gitlab_application_id",[321,502,339],{"class":331},[321,504,505,508,510,513],{"class":323,"line":342},[321,506,507],{"class":327},"STUDIO_GITLAB_APPLICATION_SECRET",[321,509,332],{"class":331},[321,511,512],{"class":335},"your_gitlab_secret",[321,514,339],{"class":331},[321,516,517],{"class":323,"line":355},[321,518,359],{"emptyLinePlaceholder":358},[321,520,521],{"class":323,"line":362},[321,522,366],{"class":365},[321,524,525],{"class":323,"line":369},[321,526,527],{"class":365},"# STUDIO_GITLAB_MODERATORS=admin@example.com,editor@example.com\n",[321,529,530],{"class":323,"line":375},[321,531,359],{"emptyLinePlaceholder":358},[321,533,534],{"class":323,"line":380},[321,535,536],{"class":365},"# Optional: Self hosted GitLab server\n",[321,538,539,542,544],{"class":323,"line":386},[321,540,541],{"class":327},"STUDIO_GITLAB_INSTANCE_URL",[321,543,392],{"class":331},[321,545,395],{"class":335},[205,547,549],{"id":548},"google","Google",[55,551,552],{},"Google OAuth is ideal for non-technical users who don't have GitHub or GitLab accounts.",[213,554,555,559,570,574,589,591,606,611,614,624,628,632,640,644,647,755],{"level":215},[217,556,558],{"id":557},"navigate-to-google-cloud-console","Navigate to Google Cloud Console",[55,560,223,561,566,567,421],{},[68,562,565],{"href":563,"rel":564},"https:\u002F\u002Fconsole.cloud.google.com\u002F",[228],"Google Cloud Console"," and select or create a project, then navigate to ",[59,568,569],{},"APIs & Services → Credentials",[217,571,573],{"id":572},"create-oauth-application","Create OAuth Application",[55,575,576,577,580,581,584,585,588],{},"Click ",[59,578,579],{},"Create Credentials"," and ",[59,582,583],{},"OAuth client ID"," and select ",[59,586,587],{},"Web application"," as the application type.",[55,590,240],{},[242,592,593,598],{},[245,594,595,250],{},[59,596,597],{},"Name",[245,599,600,256,603],{},[59,601,602],{},"Authorized redirect URIs",[200,604,605],{},"https:\u002F\u002Fyourdomain.com\u002F__nuxt_studio\u002Fauth\u002Fgoogle",[64,607,270,608],{},[200,609,610],{},"http:\u002F\u002Flocalhost:3000\u002F__nuxt_studio\u002Fauth\u002Fgoogle",[55,612,613],{},"After creating the OAuth client, you'll receive:",[242,615,616,620],{},[245,617,285,618],{},[59,619,288],{},[245,621,285,622],{},[59,623,294],{},[625,626,627],"warning",{},"Save these credentials immediately; you may not be able to view them again.",[217,629,631],{"id":630},"create-a-personal-access-token","Create a Personal Access Token",[55,633,634,635,639],{},"Since Google doesn't provide Git access, you must also configure a ",[68,636,638],{"href":637},"\u002Fgit-providers#creating-a-personal-access-token","Personal Access Token"," for repository operations.",[217,641,643],{"id":642},"set-environment-variables","Set Environment Variables",[55,645,646],{},"Add the Google OAuth credentials, your personal access token and moderator list:",[648,649,650,706],"tabs",{},[651,652,655],"tabs-item",{"icon":653,"label":654},"i-lucide-github","With GitHub Repository",[312,656,658],{"className":314,"code":657,"filename":309,"language":316,"meta":317,"style":317},"STUDIO_GOOGLE_CLIENT_ID=\u003Cyour_google_client_id>\nSTUDIO_GOOGLE_CLIENT_SECRET=\u003Cyour_google_client_secret>\nSTUDIO_GITHUB_TOKEN=\u003Cyour_github_personal_access_token>\nSTUDIO_GOOGLE_MODERATORS=admin@example.com,editor@example.com\n",[200,659,660,672,684,696],{"__ignoreMap":317},[321,661,662,665,667,670],{"class":323,"line":324},[321,663,664],{"class":327},"STUDIO_GOOGLE_CLIENT_ID",[321,666,332],{"class":331},[321,668,669],{"class":335},"your_google_client_id",[321,671,339],{"class":331},[321,673,674,677,679,682],{"class":323,"line":342},[321,675,676],{"class":327},"STUDIO_GOOGLE_CLIENT_SECRET",[321,678,332],{"class":331},[321,680,681],{"class":335},"your_google_client_secret",[321,683,339],{"class":331},[321,685,686,689,691,694],{"class":323,"line":355},[321,687,688],{"class":327},"STUDIO_GITHUB_TOKEN",[321,690,332],{"class":331},[321,692,693],{"class":335},"your_github_personal_access_token",[321,695,339],{"class":331},[321,697,698,701,703],{"class":323,"line":362},[321,699,700],{"class":327},"STUDIO_GOOGLE_MODERATORS",[321,702,392],{"class":331},[321,704,705],{"class":335},"admin@example.com,editor@example.com\n",[651,707,710],{"icon":708,"label":709},"i-lucide-gitlab","With GitLab Repository",[312,711,713],{"className":314,"code":712,"filename":309,"language":316,"meta":317,"style":317},"STUDIO_GOOGLE_CLIENT_ID=\u003Cyour_google_client_id>\nSTUDIO_GOOGLE_CLIENT_SECRET=\u003Cyour_google_client_secret>\nSTUDIO_GITLAB_TOKEN=\u003Cyour_gitlab_personal_access_token>\nSTUDIO_GOOGLE_MODERATORS=admin@example.com,editor@example.com\n",[200,714,715,725,735,747],{"__ignoreMap":317},[321,716,717,719,721,723],{"class":323,"line":324},[321,718,664],{"class":327},[321,720,332],{"class":331},[321,722,669],{"class":335},[321,724,339],{"class":331},[321,726,727,729,731,733],{"class":323,"line":342},[321,728,676],{"class":327},[321,730,332],{"class":331},[321,732,681],{"class":335},[321,734,339],{"class":331},[321,736,737,740,742,745],{"class":323,"line":355},[321,738,739],{"class":327},"STUDIO_GITLAB_TOKEN",[321,741,332],{"class":331},[321,743,744],{"class":335},"your_gitlab_personal_access_token",[321,746,339],{"class":331},[321,748,749,751,753],{"class":323,"line":362},[321,750,700],{"class":327},[321,752,392],{"class":331},[321,754,705],{"class":335},[625,756,757,758,760,761,764],{},"The ",[200,759,700],{}," environment variable is ",[59,762,763],{},"required"," for Google OAuth. Only users with email addresses in this list can access Studio.",[205,766,101],{"id":767},"sso-server",[55,769,770,771,776],{},"SSO (Single Sign-On) allows you to authenticate users via a centralized authentication server like ",[68,772,775],{"href":773,"rel":774},"https:\u002F\u002Fgithub.com\u002Fnuxt-content\u002Fnuxt-studio-sso",[228],"Nuxt Studio SSO",". This is ideal for organizations managing multiple Nuxt Studio sites.",[55,778,779],{},[59,780,781],{},"Key benefits:",[242,783,784,790,796,802,808],{},[245,785,786,789],{},[59,787,788],{},"Single login",": Users authenticate once and access all connected Studio sites",[245,791,792,795],{},[59,793,794],{},"GitHub token pass-through",": When users login with GitHub on the SSO server, their GitHub token is automatically passed to Studio sites",[245,797,798,801],{},[59,799,800],{},"One GitHub OAuth client",": You can use the same GitHub OAuth client for all Studio sites, reducing the number of OAuth clients you need to manage",[245,803,804,807],{},[59,805,806],{},"Preview URL support",": The SSO server can handle preview URLs for the Studio sites with glob patterns",[245,809,810,813],{},[59,811,812],{},"Centralized user management",": Manage OAuth clients and users in one place",[213,815,816,820,827,831,847,850,853,892],{"level":215},[217,817,819],{"id":818},"deploy-the-sso-server","Deploy the SSO Server",[55,821,822,823,826],{},"Deploy ",[68,824,775],{"href":773,"rel":825},[228]," to your preferred platform (Vercel, Cloudflare, etc.).",[217,828,830],{"id":829},"register-your-site-as-an-oauth-client","Register Your Site as an OAuth Client",[832,833,834,837,840],"ol",{},[245,835,836],{},"Login to the SSO server dashboard",[245,838,839],{},"Create a new OAuth client with your site's URL",[245,841,842,843,580,845],{},"Copy the ",[59,844,288],{},[59,846,294],{},[217,848,643],{"id":849},"set-environment-variables-1",[55,851,852],{},"Add the SSO credentials to your deployment platform's environment variables:",[312,854,856],{"className":314,"code":855,"filename":309,"language":316,"meta":317,"style":317},"STUDIO_SSO_URL=https:\u002F\u002Fyour-sso-server.com\nSTUDIO_SSO_CLIENT_ID=\u003Cyour_client_id>\nSTUDIO_SSO_CLIENT_SECRET=\u003Cyour_client_secret>\n",[200,857,858,868,880],{"__ignoreMap":317},[321,859,860,863,865],{"class":323,"line":324},[321,861,862],{"class":327},"STUDIO_SSO_URL",[321,864,392],{"class":331},[321,866,867],{"class":335},"https:\u002F\u002Fyour-sso-server.com\n",[321,869,870,873,875,878],{"class":323,"line":342},[321,871,872],{"class":327},"STUDIO_SSO_CLIENT_ID",[321,874,332],{"class":331},[321,876,877],{"class":335},"your_client_id",[321,879,339],{"class":331},[321,881,882,885,887,890],{"class":323,"line":355},[321,883,884],{"class":327},"STUDIO_SSO_CLIENT_SECRET",[321,886,332],{"class":331},[321,888,889],{"class":335},"your_client_secret",[321,891,339],{"class":331},[64,893,894,895],{},"The callback URL is automatically set to ",[200,896,897],{},"https:\u002F\u002Fyourdomain.com\u002F__nuxt_studio\u002Fauth\u002Fsso",[196,899,900],{},"When users authenticate with GitHub on the SSO server, their GitHub access token is automatically passed through to Studio. This means commits are made with the user's own GitHub identity, and no shared PAT is needed.",[73,902,904],{"id":903},"custom-authentication","Custom Authentication",[55,906,907],{},"For complete control over authentication, you can implement your own auth logic (password forms, SSO, LDAP, etc.) using Studio's session utilities.",[625,909,911,912,915],{"title":910},"Security Responsibility","When using custom authentication, ",[59,913,914],{},"you are fully responsible for securing your authentication flow",". Studio only manages the session after you authenticate the user.",[205,917,919],{"id":918},"personal-access-token-required","Personal Access Token Required",[55,921,922],{},"You must configure a Personal Access Token for repository operations based on the Git provider you are using.",[312,924,926],{"className":314,"code":925,"filename":309,"language":316,"meta":317,"style":317},"# For GitHub repositories\nSTUDIO_GITHUB_TOKEN=\u003Cyour_github_personal_access_token>\n\n# For GitLab repositories\nSTUDIO_GITLAB_TOKEN=\u003Cyour_gitlab_personal_access_token>\n",[200,927,928,933,943,947,952],{"__ignoreMap":317},[321,929,930],{"class":323,"line":324},[321,931,932],{"class":365},"# For GitHub repositories\n",[321,934,935,937,939,941],{"class":323,"line":342},[321,936,688],{"class":327},[321,938,332],{"class":331},[321,940,693],{"class":335},[321,942,339],{"class":331},[321,944,945],{"class":323,"line":355},[321,946,359],{"emptyLinePlaceholder":358},[321,948,949],{"class":323,"line":362},[321,950,951],{"class":365},"# For GitLab repositories\n",[321,953,954,956,958,960],{"class":323,"line":369},[321,955,739],{"class":327},[321,957,332],{"class":331},[321,959,744],{"class":335},[321,961,339],{"class":331},[55,963,964,965,967],{},"See ",[68,966,15],{"href":637}," for instructions on creating a PAT.",[205,969,971],{"id":970},"implementation-flow","Implementation Flow",[832,973,974,980,994],{},[245,975,976,979],{},[59,977,978],{},"Validate the user"," in your login handler using your preferred method (password, SSO, etc.)",[245,981,982,985,986,989,990,993],{},[59,983,984],{},"Create the session"," by calling ",[200,987,988],{},"setStudioUserSession(event, user)"," with a ",[200,991,992],{},"StudioUserSession"," object",[245,995,996,985,999,1002],{},[59,997,998],{},"Handle logout",[200,1000,1001],{},"clearStudioUserSession(event)"," to clear the session",[205,1004,1006],{"id":1005},"required-session-fields","Required Session Fields",[55,1008,1009,1010,1013],{},"When calling ",[200,1011,1012],{},"setStudioUserSession",", you must provide:",[78,1015,1016,1032],{},[81,1017,1018],{},[84,1019,1020,1023,1026,1029],{},[87,1021,1022],{},"Field",[87,1024,1025],{},"Type",[87,1027,1028],{},"Required",[87,1030,1031],{},"Description",[106,1033,1034,1051,1067,1084],{},[84,1035,1036,1041,1046,1048],{},[111,1037,1038],{},[200,1039,1040],{},"name",[111,1042,1043],{},[200,1044,1045],{},"string",[111,1047,118],{},[111,1049,1050],{},"Display name for the user",[84,1052,1053,1058,1062,1064],{},[111,1054,1055],{},[200,1056,1057],{},"email",[111,1059,1060],{},[200,1061,1045],{},[111,1063,118],{},[111,1065,1066],{},"User's email address",[84,1068,1069,1074,1078,1081],{},[111,1070,1071],{},[200,1072,1073],{},"providerId",[111,1075,1076],{},[200,1077,1045],{},[111,1079,1080],{},"❌",[111,1082,1083],{},"Unique identifier for the user",[84,1085,1086,1091,1095,1097],{},[111,1087,1088],{},[200,1089,1090],{},"avatar",[111,1092,1093],{},[200,1094,1045],{},[111,1096,1080],{},[111,1098,1099],{},"URL to user's avatar image",[205,1101,1103],{"id":1102},"example-password-based-login","Example: Password-based Login",[312,1105,1110],{"className":1106,"code":1107,"filename":1108,"language":1109,"meta":317,"style":317},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { eventHandler, readBody, createError } from 'h3'\nimport { setStudioUserSession } from '#imports'\n\nexport default eventHandler(async (event) => {\n  const { email, password } = await readBody\u003C{ email?: string, password?: string }>(event)\n\n  \u002F\u002F ⚠️️ Implement your own secure validation logic here\n  \u002F\u002F This is a simplified example - use proper password hashing and validation\n  const user = await validateCredentials(email, password)\n\n  if (!user) {\n    throw createError({\n      statusCode: 401,\n      message: 'Invalid credentials'\n    })\n  }\n\n  await setStudioUserSession(event, {\n    providerId: user.id,\n    name: user.name,\n    email: user.email,\n    avatar: user.avatar || ''\n  })\n\n  return { ok: true }\n})\n","server\u002Fapi\u002Fstudio\u002Flogin.ts","ts",[200,1111,1112,1149,1169,1173,1206,1262,1266,1271,1276,1301,1306,1326,1338,1354,1369,1377,1383,1388,1404,1421,1437,1453,1473,1481,1486,1506],{"__ignoreMap":317},[321,1113,1114,1118,1121,1124,1127,1130,1132,1135,1138,1141,1144,1146],{"class":323,"line":324},[321,1115,1117],{"class":1116},"s7zQu","import",[321,1119,1120],{"class":331}," {",[321,1122,1123],{"class":327}," eventHandler",[321,1125,1126],{"class":331},",",[321,1128,1129],{"class":327}," readBody",[321,1131,1126],{"class":331},[321,1133,1134],{"class":327}," createError",[321,1136,1137],{"class":331}," }",[321,1139,1140],{"class":1116}," from",[321,1142,1143],{"class":331}," '",[321,1145,205],{"class":335},[321,1147,1148],{"class":331},"'\n",[321,1150,1151,1153,1155,1158,1160,1162,1164,1167],{"class":323,"line":342},[321,1152,1117],{"class":1116},[321,1154,1120],{"class":331},[321,1156,1157],{"class":327}," setStudioUserSession",[321,1159,1137],{"class":331},[321,1161,1140],{"class":1116},[321,1163,1143],{"class":331},[321,1165,1166],{"class":335},"#imports",[321,1168,1148],{"class":331},[321,1170,1171],{"class":323,"line":355},[321,1172,359],{"emptyLinePlaceholder":358},[321,1174,1175,1178,1181,1184,1187,1191,1194,1198,1200,1203],{"class":323,"line":362},[321,1176,1177],{"class":1116},"export",[321,1179,1180],{"class":1116}," default",[321,1182,1123],{"class":1183},"s2Zo4",[321,1185,1186],{"class":327},"(",[321,1188,1190],{"class":1189},"spNyl","async",[321,1192,1193],{"class":331}," (",[321,1195,1197],{"class":1196},"sHdIc","event",[321,1199,299],{"class":331},[321,1201,1202],{"class":1189}," =>",[321,1204,1205],{"class":331}," {\n",[321,1207,1208,1211,1213,1216,1218,1221,1223,1226,1229,1231,1234,1237,1240,1244,1246,1248,1250,1252,1255,1257,1259],{"class":323,"line":369},[321,1209,1210],{"class":1189},"  const",[321,1212,1120],{"class":331},[321,1214,1215],{"class":327}," email",[321,1217,1126],{"class":331},[321,1219,1220],{"class":327}," password",[321,1222,1137],{"class":331},[321,1224,1225],{"class":331}," =",[321,1227,1228],{"class":1116}," await",[321,1230,1129],{"class":1183},[321,1232,1233],{"class":331},"\u003C{",[321,1235,1215],{"class":1236},"swJcz",[321,1238,1239],{"class":331},"?:",[321,1241,1243],{"class":1242},"sBMFI"," string",[321,1245,1126],{"class":331},[321,1247,1220],{"class":1236},[321,1249,1239],{"class":331},[321,1251,1243],{"class":1242},[321,1253,1254],{"class":331}," }>",[321,1256,1186],{"class":1236},[321,1258,1197],{"class":327},[321,1260,1261],{"class":1236},")\n",[321,1263,1264],{"class":323,"line":375},[321,1265,359],{"emptyLinePlaceholder":358},[321,1267,1268],{"class":323,"line":380},[321,1269,1270],{"class":365},"  \u002F\u002F ⚠️️ Implement your own secure validation logic here\n",[321,1272,1273],{"class":323,"line":386},[321,1274,1275],{"class":365},"  \u002F\u002F This is a simplified example - use proper password hashing and validation\n",[321,1277,1279,1281,1284,1286,1288,1291,1293,1295,1297,1299],{"class":323,"line":1278},9,[321,1280,1210],{"class":1189},[321,1282,1283],{"class":327}," user",[321,1285,1225],{"class":331},[321,1287,1228],{"class":1116},[321,1289,1290],{"class":1183}," validateCredentials",[321,1292,1186],{"class":1236},[321,1294,1057],{"class":327},[321,1296,1126],{"class":331},[321,1298,1220],{"class":327},[321,1300,1261],{"class":1236},[321,1302,1304],{"class":323,"line":1303},10,[321,1305,359],{"emptyLinePlaceholder":358},[321,1307,1309,1312,1314,1317,1320,1323],{"class":323,"line":1308},11,[321,1310,1311],{"class":1116},"  if",[321,1313,1193],{"class":1236},[321,1315,1316],{"class":331},"!",[321,1318,1319],{"class":327},"user",[321,1321,1322],{"class":1236},") ",[321,1324,1325],{"class":331},"{\n",[321,1327,1329,1332,1334,1336],{"class":323,"line":1328},12,[321,1330,1331],{"class":1116},"    throw",[321,1333,1134],{"class":1183},[321,1335,1186],{"class":1236},[321,1337,1325],{"class":331},[321,1339,1341,1344,1347,1351],{"class":323,"line":1340},13,[321,1342,1343],{"class":1236},"      statusCode",[321,1345,1346],{"class":331},":",[321,1348,1350],{"class":1349},"sbssI"," 401",[321,1352,1353],{"class":331},",\n",[321,1355,1357,1360,1362,1364,1367],{"class":323,"line":1356},14,[321,1358,1359],{"class":1236},"      message",[321,1361,1346],{"class":331},[321,1363,1143],{"class":331},[321,1365,1366],{"class":335},"Invalid credentials",[321,1368,1148],{"class":331},[321,1370,1372,1375],{"class":323,"line":1371},15,[321,1373,1374],{"class":331},"    }",[321,1376,1261],{"class":1236},[321,1378,1380],{"class":323,"line":1379},16,[321,1381,1382],{"class":331},"  }\n",[321,1384,1386],{"class":323,"line":1385},17,[321,1387,359],{"emptyLinePlaceholder":358},[321,1389,1391,1394,1396,1398,1400,1402],{"class":323,"line":1390},18,[321,1392,1393],{"class":1116},"  await",[321,1395,1157],{"class":1183},[321,1397,1186],{"class":1236},[321,1399,1197],{"class":327},[321,1401,1126],{"class":331},[321,1403,1205],{"class":331},[321,1405,1407,1410,1412,1414,1416,1419],{"class":323,"line":1406},19,[321,1408,1409],{"class":1236},"    providerId",[321,1411,1346],{"class":331},[321,1413,1283],{"class":327},[321,1415,421],{"class":331},[321,1417,1418],{"class":327},"id",[321,1420,1353],{"class":331},[321,1422,1424,1427,1429,1431,1433,1435],{"class":323,"line":1423},20,[321,1425,1426],{"class":1236},"    name",[321,1428,1346],{"class":331},[321,1430,1283],{"class":327},[321,1432,421],{"class":331},[321,1434,1040],{"class":327},[321,1436,1353],{"class":331},[321,1438,1440,1443,1445,1447,1449,1451],{"class":323,"line":1439},21,[321,1441,1442],{"class":1236},"    email",[321,1444,1346],{"class":331},[321,1446,1283],{"class":327},[321,1448,421],{"class":331},[321,1450,1057],{"class":327},[321,1452,1353],{"class":331},[321,1454,1456,1459,1461,1463,1465,1467,1470],{"class":323,"line":1455},22,[321,1457,1458],{"class":1236},"    avatar",[321,1460,1346],{"class":331},[321,1462,1283],{"class":327},[321,1464,421],{"class":331},[321,1466,1090],{"class":327},[321,1468,1469],{"class":331}," ||",[321,1471,1472],{"class":331}," ''\n",[321,1474,1476,1479],{"class":323,"line":1475},23,[321,1477,1478],{"class":331},"  }",[321,1480,1261],{"class":1236},[321,1482,1484],{"class":323,"line":1483},24,[321,1485,359],{"emptyLinePlaceholder":358},[321,1487,1489,1492,1494,1497,1499,1503],{"class":323,"line":1488},25,[321,1490,1491],{"class":1116},"  return",[321,1493,1120],{"class":331},[321,1495,1496],{"class":1236}," ok",[321,1498,1346],{"class":331},[321,1500,1502],{"class":1501},"sfNiH"," true",[321,1504,1505],{"class":331}," }\n",[321,1507,1509,1512],{"class":323,"line":1508},26,[321,1510,1511],{"class":331},"}",[321,1513,1261],{"class":327},[205,1515,1517],{"id":1516},"example-logout-handler","Example: Logout Handler",[312,1519,1522],{"className":1106,"code":1520,"filename":1521,"language":1109,"meta":317,"style":317},"import { eventHandler } from 'h3'\nimport { clearStudioUserSession } from '#imports'\n\nexport default eventHandler(async (event) => {\n  await clearStudioUserSession(event)\n  return { ok: true }\n})\n","server\u002Fapi\u002Fstudio\u002Flogout.ts",[200,1523,1524,1542,1561,1565,1587,1599,1613],{"__ignoreMap":317},[321,1525,1526,1528,1530,1532,1534,1536,1538,1540],{"class":323,"line":324},[321,1527,1117],{"class":1116},[321,1529,1120],{"class":331},[321,1531,1123],{"class":327},[321,1533,1137],{"class":331},[321,1535,1140],{"class":1116},[321,1537,1143],{"class":331},[321,1539,205],{"class":335},[321,1541,1148],{"class":331},[321,1543,1544,1546,1548,1551,1553,1555,1557,1559],{"class":323,"line":342},[321,1545,1117],{"class":1116},[321,1547,1120],{"class":331},[321,1549,1550],{"class":327}," clearStudioUserSession",[321,1552,1137],{"class":331},[321,1554,1140],{"class":1116},[321,1556,1143],{"class":331},[321,1558,1166],{"class":335},[321,1560,1148],{"class":331},[321,1562,1563],{"class":323,"line":355},[321,1564,359],{"emptyLinePlaceholder":358},[321,1566,1567,1569,1571,1573,1575,1577,1579,1581,1583,1585],{"class":323,"line":362},[321,1568,1177],{"class":1116},[321,1570,1180],{"class":1116},[321,1572,1123],{"class":1183},[321,1574,1186],{"class":327},[321,1576,1190],{"class":1189},[321,1578,1193],{"class":331},[321,1580,1197],{"class":1196},[321,1582,299],{"class":331},[321,1584,1202],{"class":1189},[321,1586,1205],{"class":331},[321,1588,1589,1591,1593,1595,1597],{"class":323,"line":369},[321,1590,1393],{"class":1116},[321,1592,1550],{"class":1183},[321,1594,1186],{"class":1236},[321,1596,1197],{"class":327},[321,1598,1261],{"class":1236},[321,1600,1601,1603,1605,1607,1609,1611],{"class":323,"line":375},[321,1602,1491],{"class":1116},[321,1604,1120],{"class":331},[321,1606,1496],{"class":1236},[321,1608,1346],{"class":331},[321,1610,1502],{"class":1501},[321,1612,1505],{"class":331},[321,1614,1615,1617],{"class":323,"line":380},[321,1616,1511],{"class":331},[321,1618,1261],{"class":327},[205,1620,1622],{"id":1621},"redirecting-after-login","Redirecting After Login",[55,1624,1625,1626,1629],{},"After successfully setting the session, redirect users to your app root (",[200,1627,1628],{},"\u002F","). Studio will automatically detect the session and activate for that user.",[312,1631,1633],{"className":1106,"code":1632,"filename":1108,"language":1109,"meta":317,"style":317},"\u002F\u002F After setStudioUserSession...\nreturn sendRedirect(event, '\u002F')\n",[200,1634,1635,1640],{"__ignoreMap":317},[321,1636,1637],{"class":323,"line":324},[321,1638,1639],{"class":365},"\u002F\u002F After setStudioUserSession...\n",[321,1641,1642,1645,1648,1651,1653,1655,1657,1660],{"class":323,"line":342},[321,1643,1644],{"class":1116},"return",[321,1646,1647],{"class":1183}," sendRedirect",[321,1649,1650],{"class":327},"(event",[321,1652,1126],{"class":331},[321,1654,1143],{"class":331},[321,1656,1628],{"class":335},[321,1658,1659],{"class":331},"'",[321,1661,1261],{"class":327},[73,1663,1665],{"id":1664},"advanced-options","Advanced Options",[205,1667,1669],{"id":1668},"access-control-with-moderators","Access Control with Moderators",[55,1671,1672,1673,1676],{},"You can restrict access to Studio by defining a whitelist of authorized users through the ",[200,1674,1675],{},"STUDIO_{PROVIDER}_MODERATORS"," environment variable.",[312,1678,1680],{"className":314,"code":1679,"filename":309,"language":316,"meta":317,"style":317},"# GitHub OAuth moderators\nSTUDIO_GITHUB_MODERATORS=admin@example.com,editor@example.com\n\n# GitLab OAuth moderators\nSTUDIO_GITLAB_MODERATORS=admin@example.com,editor@example.com\n\n# Google OAuth moderators (required)\nSTUDIO_GOOGLE_MODERATORS=admin@example.com,editor@example.com\n",[200,1681,1682,1687,1696,1700,1705,1714,1718,1723],{"__ignoreMap":317},[321,1683,1684],{"class":323,"line":324},[321,1685,1686],{"class":365},"# GitHub OAuth moderators\n",[321,1688,1689,1692,1694],{"class":323,"line":342},[321,1690,1691],{"class":327},"STUDIO_GITHUB_MODERATORS",[321,1693,392],{"class":331},[321,1695,705],{"class":335},[321,1697,1698],{"class":323,"line":355},[321,1699,359],{"emptyLinePlaceholder":358},[321,1701,1702],{"class":323,"line":362},[321,1703,1704],{"class":365},"# GitLab OAuth moderators\n",[321,1706,1707,1710,1712],{"class":323,"line":369},[321,1708,1709],{"class":327},"STUDIO_GITLAB_MODERATORS",[321,1711,392],{"class":331},[321,1713,705],{"class":335},[321,1715,1716],{"class":323,"line":375},[321,1717,359],{"emptyLinePlaceholder":358},[321,1719,1720],{"class":323,"line":380},[321,1721,1722],{"class":365},"# Google OAuth moderators (required)\n",[321,1724,1725,1727,1729],{"class":323,"line":386},[321,1726,700],{"class":327},[321,1728,392],{"class":331},[321,1730,705],{"class":335},[55,1732,1733],{},"The moderator list is a comma-separated list of email addresses. Only users with matching email addresses will be granted access.",[217,1735,1737],{"id":1736},"behavior-by-provider","Behavior by Provider",[78,1739,1740,1753],{},[81,1741,1742],{},[84,1743,1744,1747,1750],{},[87,1745,1746],{},"Provider",[87,1748,1749],{},"Moderator List",[87,1751,1752],{},"Behavior",[106,1754,1755,1765,1773,1784],{},[84,1756,1757,1759,1762],{},[111,1758,92],{},[111,1760,1761],{},"Optional",[111,1763,1764],{},"If empty, all OAuth-authenticated users have access",[84,1766,1767,1769,1771],{},[111,1768,95],{},[111,1770,1761],{},[111,1772,1764],{},[84,1774,1775,1777,1781],{},[111,1776,98],{},[111,1778,1779],{},[59,1780,1028],{},[111,1782,1783],{},"Without moderators, no one can access Studio",[84,1785,1786,1788,1791],{},[111,1787,104],{},[111,1789,1790],{},"N\u002FA",[111,1792,1793],{},"Implement your own access control logic",[64,1795,1796],{},"For GitHub and GitLab OAuth, repository write access is still controlled by OAuth scopes, preventing unauthorized users from pushing changes even if they can access Studio.",[205,1798,1800],{"id":1799},"custom-redirect-url","Custom Redirect URL",[55,1802,1803],{},"By default, Studio uses your deployment URL for OAuth callbacks. To customize the redirect URL:",[312,1805,1807],{"className":314,"code":1806,"filename":309,"language":316,"meta":317,"style":317},"# GitHub OAuth\nSTUDIO_GITHUB_REDIRECT_URL=https:\u002F\u002Fcustom-domain.com\u002F__nuxt_studio\u002Fauth\u002Fgithub\n\n# GitLab OAuth\nSTUDIO_GITLAB_REDIRECT_URL=https:\u002F\u002Fcustom-domain.com\u002F__nuxt_studio\u002Fauth\u002Fgitlab\n\n# Google OAuth\nSTUDIO_GOOGLE_REDIRECT_URL=https:\u002F\u002Fcustom-domain.com\u002F__nuxt_studio\u002Fauth\u002Fgoogle\n",[200,1808,1809,1814,1824,1828,1833,1843,1847,1852],{"__ignoreMap":317},[321,1810,1811],{"class":323,"line":324},[321,1812,1813],{"class":365},"# GitHub OAuth\n",[321,1815,1816,1819,1821],{"class":323,"line":342},[321,1817,1818],{"class":327},"STUDIO_GITHUB_REDIRECT_URL",[321,1820,392],{"class":331},[321,1822,1823],{"class":335},"https:\u002F\u002Fcustom-domain.com\u002F__nuxt_studio\u002Fauth\u002Fgithub\n",[321,1825,1826],{"class":323,"line":355},[321,1827,359],{"emptyLinePlaceholder":358},[321,1829,1830],{"class":323,"line":362},[321,1831,1832],{"class":365},"# GitLab OAuth\n",[321,1834,1835,1838,1840],{"class":323,"line":369},[321,1836,1837],{"class":327},"STUDIO_GITLAB_REDIRECT_URL",[321,1839,392],{"class":331},[321,1841,1842],{"class":335},"https:\u002F\u002Fcustom-domain.com\u002F__nuxt_studio\u002Fauth\u002Fgitlab\n",[321,1844,1845],{"class":323,"line":375},[321,1846,359],{"emptyLinePlaceholder":358},[321,1848,1849],{"class":323,"line":380},[321,1850,1851],{"class":365},"# Google OAuth\n",[321,1853,1854,1857,1859],{"class":323,"line":386},[321,1855,1856],{"class":327},"STUDIO_GOOGLE_REDIRECT_URL",[321,1858,392],{"class":331},[321,1860,1861],{"class":335},"https:\u002F\u002Fcustom-domain.com\u002F__nuxt_studio\u002Fauth\u002Fgoogle\n",[64,1863,1864],{},"This is useful when you need to handle OAuth callbacks through a specific endpoint, such as behind a reverse proxy or with custom domain routing.",[205,1866,1868],{"id":1867},"server-hooks","Server Hooks",[55,1870,1871],{},"Studio provides Nitro hooks that allow you to execute custom logic during authentication events.",[217,1873,1875],{"id":1874},"studioauthlogin",[200,1876,1877],{},"studio:auth:login",[55,1879,1880],{},"Called when a user successfully logs in to Studio. This hook receives the authenticated user and the current H3 event.",[55,1882,1883],{},[59,1884,1885],{},"Payload:",[78,1887,1888,1898],{},[81,1889,1890],{},[84,1891,1892,1894,1896],{},[87,1893,1022],{},[87,1895,1025],{},[87,1897,1031],{},[106,1899,1900,1914],{},[84,1901,1902,1906,1911],{},[111,1903,1904],{},[200,1905,1319],{},[111,1907,1908],{},[200,1909,1910],{},"StudioUser",[111,1912,1913],{},"The authenticated user object",[84,1915,1916,1920,1925],{},[111,1917,1918],{},[200,1919,1197],{},[111,1921,1922],{},[200,1923,1924],{},"H3Event",[111,1926,1927],{},"The H3 event object from the current request",[55,1929,1930],{},[59,1931,1932],{},"Example Usage:",[312,1934,1937],{"className":1106,"code":1935,"filename":1936,"language":1109,"meta":317,"style":317},"export default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('studio:auth:login', async ({ user, event }) => {\n    console.log(`User ${user.email} logged in via ${user.provider}`)\n\n    \u002F\u002F ... Track login analytics\n    \u002F\u002F ... Notifications\n    \u002F\u002F ... Extra session management for custom auth\n  })\n})\n","server\u002Fplugins\u002Fstudio.ts",[200,1938,1939,1961,2006,2052,2056,2061,2066,2071,2077],{"__ignoreMap":317},[321,1940,1941,1943,1945,1948,1950,1952,1955,1957,1959],{"class":323,"line":324},[321,1942,1177],{"class":1116},[321,1944,1180],{"class":1116},[321,1946,1947],{"class":1183}," defineNitroPlugin",[321,1949,1186],{"class":327},[321,1951,1186],{"class":331},[321,1953,1954],{"class":1196},"nitroApp",[321,1956,299],{"class":331},[321,1958,1202],{"class":1189},[321,1960,1205],{"class":331},[321,1962,1963,1966,1968,1971,1973,1976,1978,1980,1982,1984,1986,1989,1992,1994,1996,1999,2002,2004],{"class":323,"line":342},[321,1964,1965],{"class":327},"  nitroApp",[321,1967,421],{"class":331},[321,1969,1970],{"class":327},"hooks",[321,1972,421],{"class":331},[321,1974,1975],{"class":1183},"hook",[321,1977,1186],{"class":1236},[321,1979,1659],{"class":331},[321,1981,1877],{"class":335},[321,1983,1659],{"class":331},[321,1985,1126],{"class":331},[321,1987,1988],{"class":1189}," async",[321,1990,1991],{"class":331}," ({",[321,1993,1283],{"class":1196},[321,1995,1126],{"class":331},[321,1997,1998],{"class":1196}," event",[321,2000,2001],{"class":331}," })",[321,2003,1202],{"class":1189},[321,2005,1205],{"class":331},[321,2007,2008,2011,2013,2016,2018,2021,2024,2027,2029,2031,2033,2035,2038,2040,2042,2044,2047,2050],{"class":323,"line":355},[321,2009,2010],{"class":327},"    console",[321,2012,421],{"class":331},[321,2014,2015],{"class":1183},"log",[321,2017,1186],{"class":1236},[321,2019,2020],{"class":331},"`",[321,2022,2023],{"class":335},"User ",[321,2025,2026],{"class":331},"${",[321,2028,1319],{"class":327},[321,2030,421],{"class":331},[321,2032,1057],{"class":327},[321,2034,1511],{"class":331},[321,2036,2037],{"class":335}," logged in via ",[321,2039,2026],{"class":331},[321,2041,1319],{"class":327},[321,2043,421],{"class":331},[321,2045,2046],{"class":327},"provider",[321,2048,2049],{"class":331},"}`",[321,2051,1261],{"class":1236},[321,2053,2054],{"class":323,"line":362},[321,2055,359],{"emptyLinePlaceholder":358},[321,2057,2058],{"class":323,"line":369},[321,2059,2060],{"class":365},"    \u002F\u002F ... Track login analytics\n",[321,2062,2063],{"class":323,"line":375},[321,2064,2065],{"class":365},"    \u002F\u002F ... Notifications\n",[321,2067,2068],{"class":323,"line":380},[321,2069,2070],{"class":365},"    \u002F\u002F ... Extra session management for custom auth\n",[321,2072,2073,2075],{"class":323,"line":386},[321,2074,1478],{"class":331},[321,2076,1261],{"class":1236},[321,2078,2079,2081],{"class":323,"line":1278},[321,2080,1511],{"class":331},[321,2082,1261],{"class":327},[217,2084,2086],{"id":2085},"studioauthlogout",[200,2087,2088],{},"studio:auth:logout",[55,2090,2091],{},"Called when a user logs out from Studio. This hook receives the user who logged out and the current H3 event.",[55,2093,2094],{},[59,2095,1885],{},[78,2097,2098,2108],{},[81,2099,2100],{},[84,2101,2102,2104,2106],{},[87,2103,1022],{},[87,2105,1025],{},[87,2107,1031],{},[106,2109,2110,2123],{},[84,2111,2112,2116,2120],{},[111,2113,2114],{},[200,2115,1319],{},[111,2117,2118],{},[200,2119,1910],{},[111,2121,2122],{},"The user object who is logging out",[84,2124,2125,2129,2133],{},[111,2126,2127],{},[200,2128,1197],{},[111,2130,2131],{},[200,2132,1924],{},[111,2134,1927],{},[55,2136,2137],{},[59,2138,1932],{},[312,2140,2142],{"className":1106,"code":2141,"filename":1936,"language":1109,"meta":317,"style":317},"export default defineNitroPlugin((nitroApp) => {\n  nitroApp.hooks.hook('studio:auth:logout', async ({ user, event }) => {\n    \u002F\u002F Log logout events\n    console.log(`User ${user.email} logged out`)\n\n    \u002F\u002F ... Clean ressources\n    \u002F\u002F ... Notifications\n    \u002F\u002F ... Extra session management for custom auth\n  })\n})\n",[200,2143,2144,2164,2202,2207,2238,2242,2247,2251,2255,2261],{"__ignoreMap":317},[321,2145,2146,2148,2150,2152,2154,2156,2158,2160,2162],{"class":323,"line":324},[321,2147,1177],{"class":1116},[321,2149,1180],{"class":1116},[321,2151,1947],{"class":1183},[321,2153,1186],{"class":327},[321,2155,1186],{"class":331},[321,2157,1954],{"class":1196},[321,2159,299],{"class":331},[321,2161,1202],{"class":1189},[321,2163,1205],{"class":331},[321,2165,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196,2198,2200],{"class":323,"line":342},[321,2167,1965],{"class":327},[321,2169,421],{"class":331},[321,2171,1970],{"class":327},[321,2173,421],{"class":331},[321,2175,1975],{"class":1183},[321,2177,1186],{"class":1236},[321,2179,1659],{"class":331},[321,2181,2088],{"class":335},[321,2183,1659],{"class":331},[321,2185,1126],{"class":331},[321,2187,1988],{"class":1189},[321,2189,1991],{"class":331},[321,2191,1283],{"class":1196},[321,2193,1126],{"class":331},[321,2195,1998],{"class":1196},[321,2197,2001],{"class":331},[321,2199,1202],{"class":1189},[321,2201,1205],{"class":331},[321,2203,2204],{"class":323,"line":355},[321,2205,2206],{"class":365},"    \u002F\u002F Log logout events\n",[321,2208,2209,2211,2213,2215,2217,2219,2221,2223,2225,2227,2229,2231,2234,2236],{"class":323,"line":362},[321,2210,2010],{"class":327},[321,2212,421],{"class":331},[321,2214,2015],{"class":1183},[321,2216,1186],{"class":1236},[321,2218,2020],{"class":331},[321,2220,2023],{"class":335},[321,2222,2026],{"class":331},[321,2224,1319],{"class":327},[321,2226,421],{"class":331},[321,2228,1057],{"class":327},[321,2230,1511],{"class":331},[321,2232,2233],{"class":335}," logged out",[321,2235,2020],{"class":331},[321,2237,1261],{"class":1236},[321,2239,2240],{"class":323,"line":369},[321,2241,359],{"emptyLinePlaceholder":358},[321,2243,2244],{"class":323,"line":375},[321,2245,2246],{"class":365},"    \u002F\u002F ... Clean ressources\n",[321,2248,2249],{"class":323,"line":380},[321,2250,2065],{"class":365},[321,2252,2253],{"class":323,"line":386},[321,2254,2070],{"class":365},[321,2256,2257,2259],{"class":323,"line":1278},[321,2258,1478],{"class":331},[321,2260,1261],{"class":1236},[321,2262,2263,2265],{"class":323,"line":1303},[321,2264,1511],{"class":331},[321,2266,1261],{"class":327},[2268,2269,2270],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":317,"searchDepth":342,"depth":342,"links":2272},[2273,2274,2280,2288],{"id":75,"depth":342,"text":76},{"id":193,"depth":342,"text":194,"children":2275},[2276,2277,2278,2279],{"id":207,"depth":355,"text":208},{"id":398,"depth":355,"text":399},{"id":548,"depth":355,"text":549},{"id":767,"depth":355,"text":101},{"id":903,"depth":342,"text":904,"children":2281},[2282,2283,2284,2285,2286,2287],{"id":918,"depth":355,"text":919},{"id":970,"depth":355,"text":971},{"id":1005,"depth":355,"text":1006},{"id":1102,"depth":355,"text":1103},{"id":1516,"depth":355,"text":1517},{"id":1621,"depth":355,"text":1622},{"id":1664,"depth":342,"text":1665,"children":2289},[2290,2291,2292],{"id":1668,"depth":355,"text":1669},{"id":1799,"depth":355,"text":1800},{"id":1867,"depth":355,"text":1868},"Configure authentication providers to control access to Nuxt Studio.","md",null,{},{"title":20,"icon":23},{"title":2299,"description":2300},"Authentication Providers for Nuxt Studio","Configure GitHub, GitLab, Google OAuth, or custom authentication to secure access to your Studio instance.","OBvNQDfWv5pKxU-RvlIe6aQMjSVH8oTaXmRWGBTYfo4",[2303,2305],{"title":15,"path":16,"stem":17,"description":2304,"icon":18,"children":-1},"Configure Git providers to synchronize content between your production website and your Git repository.",{"title":25,"path":26,"stem":27,"description":2306,"icon":28,"children":-1},"Discover and select your favorite way to manage your content between the visual or the code editor.",1778168235675]