[{"data":1,"prerenderedAt":649},["ShallowReactive",2],{"navigation_docs":3,"-authentication-firebase-setup":218,"-authentication-firebase-setup-surround":644},[4,20,45,75,95,105,140,168,198],{"title":5,"path":6,"stem":7,"children":8,"page":19},"Introduction","\u002Fintroduction","1.introduction",[9,14],{"title":10,"path":11,"stem":12,"icon":13},"What is GO?","\u002Fintroduction\u002Fwhat-is-go","1.introduction\u002F1.what-is-go","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Features","\u002Fintroduction\u002Ffeatures","1.introduction\u002F2.features","i-lucide-sparkles",false,{"title":21,"path":22,"stem":23,"children":24,"page":19},"Getting Started","\u002Fgetting-started","2.getting-started",[25,30,35,40],{"title":26,"path":27,"stem":28,"icon":29},"Installation","\u002Fgetting-started\u002Finstallation","2.getting-started\u002F1.installation","i-lucide-download",{"title":31,"path":32,"stem":33,"icon":34},"Configuration","\u002Fgetting-started\u002Fconfiguration","2.getting-started\u002F2.configuration","i-lucide-settings",{"title":36,"path":37,"stem":38,"icon":39},"First Setup","\u002Fgetting-started\u002Ffirst-setup","2.getting-started\u002F3.first-setup","i-lucide-rocket",{"title":41,"path":42,"stem":43,"icon":44},"Updating","\u002Fgetting-started\u002Fupdating","2.getting-started\u002F4.updating","i-lucide-refresh-cw",{"title":46,"icon":19,"path":47,"stem":48,"children":49,"page":19},"User Guide","\u002Fuser-guide","3.user-guide",[50,55,60,65,70],{"title":51,"path":52,"stem":53,"icon":54},"Creating a Short Link","\u002Fuser-guide\u002Fcreating-a-short-link","3.user-guide\u002F1.creating-a-short-link","i-lucide-link",{"title":56,"path":57,"stem":58,"icon":59},"Expiration","\u002Fuser-guide\u002Fexpiration","3.user-guide\u002F2.expiration","i-lucide-clock",{"title":61,"path":62,"stem":63,"icon":64},"Renewing Links","\u002Fuser-guide\u002Frenewing-links","3.user-guide\u002F3.renewing-links","i-lucide-repeat",{"title":66,"path":67,"stem":68,"icon":69},"Dashboard","\u002Fuser-guide\u002Fdashboard","3.user-guide\u002F4.dashboard","i-lucide-layout-dashboard",{"title":71,"path":72,"stem":73,"icon":74},"Analytics","\u002Fuser-guide\u002Fanalytics","3.user-guide\u002F5.analytics","i-lucide-bar-chart-3",{"title":76,"path":77,"stem":78,"children":79,"page":19},"Authentication","\u002Fauthentication","4.authentication",[80,85,90],{"title":81,"path":82,"stem":83,"icon":84},"Email Login","\u002Fauthentication\u002Femail-login","4.authentication\u002F1.email-login","i-lucide-mail",{"title":86,"path":87,"stem":88,"icon":89},"Google Login","\u002Fauthentication\u002Fgoogle-login","4.authentication\u002F2.google-login","i-lucide-globe",{"title":91,"path":92,"stem":93,"icon":94},"Firebase Setup","\u002Fauthentication\u002Ffirebase-setup","4.authentication\u002F3.firebase-setup","i-simple-icons-firebase",{"title":96,"path":97,"stem":98,"children":99,"page":19},"Captcha","\u002Fcaptcha","5.captcha",[100],{"title":101,"path":102,"stem":103,"icon":104},"Cloudflare Turnstile","\u002Fcaptcha\u002Fcloudflare-turnstile","5.captcha\u002F1.cloudflare-turnstile","i-simple-icons-cloudflare",{"title":106,"path":107,"stem":108,"children":109,"page":19},"Administration","\u002Fadministration","6.administration",[110,115,120,125,130,135],{"title":111,"path":112,"stem":113,"icon":114},"Admin Panel","\u002Fadministration\u002Fadmin-panel","6.administration\u002F1.admin-panel","i-lucide-shield",{"title":116,"path":117,"stem":118,"icon":119},"Users","\u002Fadministration\u002Fusers","6.administration\u002F2.users","i-lucide-users",{"title":121,"path":122,"stem":123,"icon":124},"Links","\u002Fadministration\u002Flinks","6.administration\u002F3.links","i-lucide-link-2",{"title":126,"path":127,"stem":128,"icon":129},"Reports","\u002Fadministration\u002Freports","6.administration\u002F4.reports","i-lucide-flag",{"title":131,"path":132,"stem":133,"icon":134},"Bans & Timeouts","\u002Fadministration\u002Fbans-and-timeouts","6.administration\u002F5.bans-and-timeouts","i-lucide-user-x",{"title":136,"path":137,"stem":138,"icon":139},"Audit Logs","\u002Fadministration\u002Faudit-logs","6.administration\u002F6.audit-logs","i-lucide-scroll",{"title":141,"path":142,"stem":143,"children":144,"page":19},"Deployment","\u002Fdeployment","7.deployment",[145,150,155,160,165],{"title":146,"path":147,"stem":148,"icon":149},"VPS Installation","\u002Fdeployment\u002Fvps-installation","7.deployment\u002F1.vps-installation","i-lucide-server",{"title":151,"path":152,"stem":153,"icon":154},"Environment Variables","\u002Fdeployment\u002Fenvironment-variables","7.deployment\u002F2.environment-variables","i-lucide-sliders",{"title":156,"path":157,"stem":158,"icon":159},"Cloudflare Tunnel","\u002Fdeployment\u002Fcloudflare-tunnel","7.deployment\u002F3.cloudflare-tunnel","i-lucide-network",{"title":161,"path":162,"stem":163,"icon":164},"Systemd","\u002Fdeployment\u002Fsystemd","7.deployment\u002F4.systemd","i-lucide-cpu",{"title":41,"path":166,"stem":167,"icon":44},"\u002Fdeployment\u002Fupdating","7.deployment\u002F5.updating",{"title":169,"path":170,"stem":171,"children":172,"page":19},"Developer","\u002Fdeveloper","8.developer",[173,178,183,188,193],{"title":174,"path":175,"stem":176,"icon":177},"Architecture","\u002Fdeveloper\u002Farchitecture","8.developer\u002F1.architecture","i-lucide-box",{"title":179,"path":180,"stem":181,"icon":182},"API Architecture","\u002Fdeveloper\u002Fapi","8.developer\u002F2.api","i-lucide-code-xml",{"title":184,"path":185,"stem":186,"icon":187},"Database","\u002Fdeveloper\u002Fdatabase","8.developer\u002F3.database","i-lucide-database",{"title":189,"path":190,"stem":191,"icon":192},"Development","\u002Fdeveloper\u002Fdevelopment","8.developer\u002F4.development","i-lucide-terminal",{"title":194,"path":195,"stem":196,"icon":197},"Building Releases","\u002Fdeveloper\u002Fbuilding-releases","8.developer\u002F5.building-releases","i-lucide-package-check",{"title":199,"path":200,"stem":201,"children":202,"page":19},"Reference","\u002Freference","9.reference",[203,208,213],{"title":204,"path":205,"stem":206,"icon":207},"Configuration Reference","\u002Freference\u002Fconfiguration","9.reference\u002F1.configuration","i-lucide-file-cog",{"title":209,"path":210,"stem":211,"icon":212},"API Reference","\u002Freference\u002Fapi-reference","9.reference\u002F2.api-reference","i-lucide-webhook",{"title":214,"path":215,"stem":216,"icon":217},"Changelog","\u002Freference\u002Fchangelog","9.reference\u002F3.changelog","i-lucide-history",{"id":219,"title":91,"body":220,"description":635,"extension":636,"links":637,"meta":638,"navigation":639,"path":92,"seo":640,"stem":93,"__hash__":643},"docs\u002F4.authentication\u002F3.firebase-setup.md",{"type":221,"value":222,"toc":615},"minimark",[223,227,236,239,244,298,300,304,407,409,413,466,468,472,476,523,525,529,536,579,587,590,611],[224,225,91],"h1",{"id":226},"firebase-setup",[228,229,230,231,235],"p",{},"GO Shortener integrates with ",[232,233,234],"strong",{},"Firebase Authentication"," to enable Google OAuth sign-in. Follow this step-by-step guide to configure your Firebase project and connect it to your GO instance.",[237,238],"hr",{},[240,241,243],"h2",{"id":242},"step-1-create-a-firebase-project","Step 1: Create a Firebase Project",[245,246,247,252,263,267,278],"steps",{},[248,249,251],"h3",{"id":250},"_1-open-firebase-console","1. Open Firebase Console",[228,253,254,255,262],{},"Navigate to the ",[256,257,261],"a",{"href":258,"rel":259},"https:\u002F\u002Fconsole.firebase.google.com\u002F",[260],"nofollow","Firebase Console"," and sign in with your Google account.",[248,264,266],{"id":265},"_2-add-new-project","2. Add New Project",[228,268,269,270,273,274,277],{},"Click ",[232,271,272],{},"Add project"," (or ",[232,275,276],{},"Create a project",").",[279,280,281,289,292],"ul",{},[282,283,284,285,277],"li",{},"Enter a project name (e.g., ",[286,287,288],"code",{},"go-shortener-auth",[282,290,291],{},"Google Analytics is optional; you can disable it if not needed.",[282,293,269,294,297],{},[232,295,296],{},"Create project"," and wait for provisioning to complete.",[237,299],{},[240,301,303],{"id":302},"step-2-register-a-web-app","Step 2: Register a Web App",[245,305,306,310,319,323,334,338,345,404],{},[248,307,309],{"id":308},"_1-add-web-app","1. Add Web App",[228,311,312,313,318],{},"On your Firebase Project Overview dashboard, click the Web icon (",[232,314,315],{},[286,316,317],{},"\u003C\u002F>",") to register a new web application.",[248,320,322],{"id":321},"_2-app-nickname","2. App Nickname",[228,324,325,326,329,330,333],{},"Enter an app nickname (e.g., ",[286,327,328],{},"GO Web Client","). Leave Firebase Hosting unchecked unless you plan to use it. Click ",[232,331,332],{},"Register app",".",[248,335,337],{"id":336},"_3-obtain-client-configuration","3. Obtain Client Configuration",[228,339,340,341,344],{},"Firebase will display a ",[286,342,343],{},"firebaseConfig"," snippet containing your keys:",[346,347,352],"pre",{"className":348,"code":349,"language":350,"meta":351,"style":351},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const firebaseConfig = {\n  apiKey: \"AIzaSy...\",\n  authDomain: \"go-shortener-auth.firebaseapp.com\",\n  projectId: \"go-shortener-auth\",\n  storageBucket: \"go-shortener-auth.firebasestorage.app\",\n  messagingSenderId: \"123456789012\",\n  appId: \"1:123456789012:web:abcdef123456\"\n};\n","javascript","",[286,353,354,362,368,374,380,386,392,398],{"__ignoreMap":351},[355,356,359],"span",{"class":357,"line":358},"line",1,[355,360,361],{},"const firebaseConfig = {\n",[355,363,365],{"class":357,"line":364},2,[355,366,367],{},"  apiKey: \"AIzaSy...\",\n",[355,369,371],{"class":357,"line":370},3,[355,372,373],{},"  authDomain: \"go-shortener-auth.firebaseapp.com\",\n",[355,375,377],{"class":357,"line":376},4,[355,378,379],{},"  projectId: \"go-shortener-auth\",\n",[355,381,383],{"class":357,"line":382},5,[355,384,385],{},"  storageBucket: \"go-shortener-auth.firebasestorage.app\",\n",[355,387,389],{"class":357,"line":388},6,[355,390,391],{},"  messagingSenderId: \"123456789012\",\n",[355,393,395],{"class":357,"line":394},7,[355,396,397],{},"  appId: \"1:123456789012:web:abcdef123456\"\n",[355,399,401],{"class":357,"line":400},8,[355,402,403],{},"};\n",[228,405,406],{},"Keep this window open or copy the values into a temporary scratchpad.",[237,408],{},[240,410,412],{"id":411},"step-3-enable-authentication-providers","Step 3: Enable Authentication Providers",[245,414,415,419,432,436,443],{},[248,416,418],{"id":417},"_1-access-authentication","1. Access Authentication",[228,420,421,422,425,426,428,429,333],{},"In the left sidebar of the Firebase Console, navigate to ",[232,423,424],{},"Build"," > ",[232,427,76],{},", then click ",[232,430,431],{},"Get started",[248,433,435],{"id":434},"_2-enable-google-sign-in","2. Enable Google Sign-In",[228,437,438,439,442],{},"In the ",[232,440,441],{},"Sign-in method"," tab:",[444,445,446,452,458,461],"ol",{},[282,447,269,448,451],{},[232,449,450],{},"Google"," under the list of additional providers.",[282,453,454,455,333],{},"Toggle the switch to ",[232,456,457],{},"Enable",[282,459,460],{},"Select your support email address from the dropdown.",[282,462,269,463,333],{},[232,464,465],{},"Save",[237,467],{},[240,469,471],{"id":470},"step-4-configure-authorized-domains","Step 4: Configure Authorized Domains",[473,474,475],"important",{},"Google OAuth will reject authentication attempts originating from domains that are not explicitly listed in Firebase's Authorized Domains list.",[245,477,478,482,494,498,509],{},[248,479,481],{"id":480},"_1-open-authorized-domains","1. Open Authorized Domains",[228,483,438,484,486,487,490,491,333],{},[232,485,76],{}," section, click the ",[232,488,489],{},"Settings"," tab and select ",[232,492,493],{},"Authorized domains",[248,495,497],{"id":496},"_2-add-your-production-domains","2. Add Your Production Domains",[228,499,500,501,504,505,508],{},"By default, ",[286,502,503],{},"localhost"," is authorized. Click ",[232,506,507],{},"Add domain"," and enter your production hostname:",[279,510,511,516],{},[282,512,513],{},[286,514,515],{},"go.arcn.online",[282,517,518,522],{},[519,520,521],"em",{},"(Optional)"," Any custom staging or reverse proxy domains.",[237,524],{},[240,526,528],{"id":527},"step-5-configure-go-shortener-environment-variables","Step 5: Configure GO Shortener Environment Variables",[228,530,531,532,535],{},"Populate your server's ",[286,533,534],{},"\u002Froot\u002FGo-shortner\u002F.env"," file with the client credentials collected from Step 2:",[346,537,542],{"className":538,"code":539,"filename":540,"language":541,"meta":351,"style":351},"language-dotenv shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Firebase Web App Credentials\nFIREBASE_API_KEY=your_firebase_api_key_here\nFIREBASE_AUTH_DOMAIN=your-project-id.firebaseapp.com\nFIREBASE_PROJECT_ID=your-project-id\nFIREBASE_STORAGE_BUCKET=your-project-id.firebasestorage.app\nFIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id\nFIREBASE_APP_ID=your_firebase_app_id\n",".env","dotenv",[286,543,544,549,554,559,564,569,574],{"__ignoreMap":351},[355,545,546],{"class":357,"line":358},[355,547,548],{},"# Firebase Web App Credentials\n",[355,550,551],{"class":357,"line":364},[355,552,553],{},"FIREBASE_API_KEY=your_firebase_api_key_here\n",[355,555,556],{"class":357,"line":370},[355,557,558],{},"FIREBASE_AUTH_DOMAIN=your-project-id.firebaseapp.com\n",[355,560,561],{"class":357,"line":376},[355,562,563],{},"FIREBASE_PROJECT_ID=your-project-id\n",[355,565,566],{"class":357,"line":382},[355,567,568],{},"FIREBASE_STORAGE_BUCKET=your-project-id.firebasestorage.app\n",[355,570,571],{"class":357,"line":388},[355,572,573],{},"FIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id\n",[355,575,576],{"class":357,"line":394},[355,577,578],{},"FIREBASE_APP_ID=your_firebase_app_id\n",[580,581,582,583,586],"tip",{},"The GO backend securely serves these public web client parameters to the browser via the ",[286,584,585],{},"GET \u002Fapi\u002Fauth\u002Ffirebase-config"," endpoint. You do not need to rebuild the binary when updating Firebase parameters.",[228,588,589],{},"Restart the GO service to activate Google authentication:",[346,591,596],{"className":592,"code":593,"filename":594,"language":595,"meta":351,"style":351},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","systemctl restart go-shortener\n","Terminal","bash",[286,597,598],{"__ignoreMap":351},[355,599,600,604,608],{"class":357,"line":358},[355,601,603],{"class":602},"sBMFI","systemctl",[355,605,607],{"class":606},"sfazB"," restart",[355,609,610],{"class":606}," go-shortener\n",[612,613,614],"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}",{"title":351,"searchDepth":364,"depth":364,"links":616},[617,621,626,630,634],{"id":242,"depth":364,"text":243,"children":618},[619,620],{"id":250,"depth":370,"text":251},{"id":265,"depth":370,"text":266},{"id":302,"depth":364,"text":303,"children":622},[623,624,625],{"id":308,"depth":370,"text":309},{"id":321,"depth":370,"text":322},{"id":336,"depth":370,"text":337},{"id":411,"depth":364,"text":412,"children":627},[628,629],{"id":417,"depth":370,"text":418},{"id":434,"depth":370,"text":435},{"id":470,"depth":364,"text":471,"children":631},[632,633],{"id":480,"depth":370,"text":481},{"id":496,"depth":370,"text":497},{"id":527,"depth":364,"text":528},"Step-by-step instructions for configuring Firebase Authentication and Google OAuth.","md",null,{},{"icon":94},{"title":641,"description":642},"Firebase Setup Guide - GO Shortener","Complete guide for creating a Firebase project, registering a Web App, and enabling Google OAuth for GO Shortener.","4RSMLvRIcFNbF-2THuyzCC8a1hqMprN6KVtnVVzhWCk",[645,647],{"title":86,"path":87,"stem":88,"description":646,"icon":89,"children":-1},"Single Sign-On using Google OAuth with automatic account linking.",{"title":101,"path":102,"stem":103,"description":648,"icon":104,"children":-1},"Configure privacy-preserving bot detection and CAPTCHA protection with Cloudflare Turnstile.",1788462427011]