{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "social-auth-nuxtjs", "type": "registry:block", "title": "Social Auth flow for Nuxt and Supabase", "description": "Social Auth flow for Nuxt and Supabase", "dependencies": [ "@supabase/ssr@latest", "@supabase/supabase-js@latest" ], "registryDependencies": [ "button", "card", "input", "label" ], "files": [ { "path": "registry/default/social-auth/nuxtjs/app/components/login-form.vue", "content": "\n\n\n \n \n \n Welcome!\n Sign in to your account to continue\n \n \n \n \n {{ error }}\n \n {{ isLoading ? \"Logging in...\" : \"Continue with GitHub\" }}\n \n \n \n \n \n \n\n", "type": "registry:file", "target": "app/components/login-form.vue" }, { "path": "registry/default/social-auth/nuxtjs/app/components/logout-button.vue", "content": "\n\n\n Logout\n\n", "type": "registry:file", "target": "app/components/logout-button.vue" }, { "path": "registry/default/social-auth/nuxtjs/app/pages/auth/login.vue", "content": "\n\n\n \n \n \n \n \n", "type": "registry:file", "target": "app/pages/auth/login.vue" }, { "path": "registry/default/social-auth/nuxtjs/app/pages/auth/error.vue", "content": "\n\n\n \n \n \n \n \n Sorry, something went wrong.\n \n \n \n Code error: {{ errorMessage }}\n \n \n An unspecified error occurred.\n \n \n \n \n \n \n", "type": "registry:file", "target": "app/pages/auth/error.vue" }, { "path": "registry/default/social-auth/nuxtjs/app/pages/protected/index.vue", "content": "\n\n\n \n Checking authentication...\n\n \n \n Hello {{ email }}\n \n \n \n \n\n", "type": "registry:file", "target": "app/pages/protected/index.vue" }, { "path": "registry/default/social-auth/nuxtjs/server/middleware/auth.ts", "content": "import { defineEventHandler, sendRedirect } from 'h3'\nimport { createSupabaseServerClient } from '@/registry/default/clients/nuxtjs/server/supabase/client'\n\nexport default defineEventHandler(async (event) => {\n const supabase = createSupabaseServerClient(event)\n\n // Get user claims\n const { data } = await supabase.auth.getClaims()\n const user = data?.claims\n\n const pathname = event.node.req.url || '/'\n\n // Redirect if no user and not already on login/auth route\n if (\n !user &&\n !pathname.startsWith('/login') &&\n !pathname.startsWith('/auth')\n ) {\n return sendRedirect(event, '/auth/login')\n }\n\n // Return event as-is (you could return any object if needed)\n return { user }\n})\n", "type": "registry:file", "target": "server/middleware/auth.ts" }, { "path": "registry/default/social-auth/nuxtjs/server/routes/auth/oauth.ts", "content": "import { createSupabaseServerClient } from '@/registry/default/clients/nuxtjs/server/supabase/client'\nimport { defineEventHandler, getQuery, sendRedirect, getRequestURL } from \"h3\"\n\nexport default defineEventHandler(async (event) => {\n const url = getRequestURL(event) // URL object of the current request\n const query = getQuery(event)\n\n const code = query.code as string | undefined\n let next = (query.next as string | undefined) ?? \"/\"\n\n if (!next.startsWith(\"/\")) {\n next = \"/\"\n }\n\n if (code) {\n const supabase = createSupabaseServerClient(event)\n const { error } = await supabase.auth.exchangeCodeForSession(code)\n\n if (!error) {\n // Determine origin\n const forwardedHost = event.node.req.headers[\"x-forwarded-host\"] as string | undefined\n const isLocalEnv = process.env.NODE_ENV === \"development\"\n const origin = `${url.protocol}//${url.host}`\n\n if (isLocalEnv) {\n return sendRedirect(event, `${origin}${next}`)\n } else if (forwardedHost) {\n return sendRedirect(event, `https://${forwardedHost}${next}`)\n } else {\n return sendRedirect(event, `${origin}${next}`)\n }\n }\n }\n\n // fallback to error page\n const origin = `${url.protocol}//${url.host}`\n return sendRedirect(event, `${origin}/auth/error`)\n})\n", "type": "registry:file", "target": "server/routes/auth/oauth.ts" } ] }
{{ error }}
\n Code error: {{ errorMessage }}\n
\n An unspecified error occurred.\n
\n Hello {{ email }}\n