Skip to main content
RapidDev - Software Development Agency
weweb-tutorial

WeWeb User Authentication: Supabase Auth, Auth0, Xano, and Social Login

WeWeb supports four production-ready auth providers: Supabase Auth (recommended for most projects), Auth0 (enterprise), Xano Auth, and Token-based Auth (custom). Set up login and signup flows by adding the auth plugin, configuring redirect pages, and creating On submit workflows that call login/signup actions. Social login (Google, GitHub) requires enabling OAuth providers in your auth backend first.

What you'll learn

  • How to compare WeWeb's auth provider options and choose the right one for your project
  • How to install and configure Supabase Auth in WeWeb and set up login, signup, and logout flows
  • How to implement social login (Google, GitHub) via Supabase and handle OAuth redirect pages
  • How to build a password reset flow and handle email confirmation
  • How to access the authenticated user's data in bindings and workflows throughout your app
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate12 min read45–75 minWeWeb Free plan and above (auth plugin required)March 2026RapidDev Engineering Team
TL;DR

WeWeb supports four production-ready auth providers: Supabase Auth (recommended for most projects), Auth0 (enterprise), Xano Auth, and Token-based Auth (custom). Set up login and signup flows by adding the auth plugin, configuring redirect pages, and creating On submit workflows that call login/signup actions. Social login (Google, GitHub) requires enabling OAuth providers in your auth backend first.

Setting Up User Authentication in WeWeb

Authentication is one of the most common requirements for apps built in WeWeb. The platform supports multiple auth providers through its plugin system — Supabase Auth for most projects, Auth0 for enterprise with advanced requirements, Xano Auth for Xano backend users, and Token-based Auth for completely custom systems. This tutorial focuses on the Supabase Auth path (the most common choice) while covering the decision framework for choosing a provider. You will set up the full auth flow: user signup with email confirmation, login, social OAuth (Google), password reset, and logout — plus how to access the current user's data in your app's bindings and workflows.

Prerequisites

  • A WeWeb project with the Supabase backend plugin already connected (or ready to connect)
  • A Supabase project at supabase.com with email auth enabled
  • Basic familiarity with WeWeb workflows and the Plugins panel

Step-by-step guide

1

Choose your authentication provider

WeWeb offers four auth options, each with different trade-offs. Supabase Auth: the recommended default for most WeWeb projects. Natively integrates with the Supabase data source plugin — the auth token is automatically forwarded to all Supabase database operations. Supports email/password, magic links, phone OTP, and 20+ social OAuth providers. Free tier allows 50,000 monthly active users. Auth0: recommended for enterprise projects requiring advanced identity features — MFA, custom rules, enterprise SSO (SAML), extensive audit logs, or compliance requirements (SOC 2, HIPAA). Auth0 free tier supports 7,000 active users. The Auth0 WeWeb plugin auto-creates Machine-to-Machine and Single Page Application apps in Auth0. Xano Auth: use only if your backend is already Xano. The token is automatically forwarded to all Xano API calls. Requires 3 standard auth endpoints in Xano (signup, login, me). WeWeb Auth: explicitly NOT recommended for production — WeWeb's documentation states this is proof-of-concept only, not suitable for large user bases. Token-based Auth: for custom auth APIs not covered by the above options.

Expected result: You have selected an auth provider appropriate for your project. For most users reading this tutorial, that is Supabase Auth.

2

Install the Supabase Auth plugin

In the WeWeb editor, click Plugins in the left navbar → Authentication section → Supabase Auth. If you have already added the Supabase backend plugin, the auth plugin auto-detects your Supabase credentials and auto-connects. Click 'Connect' → your Supabase project is linked. In the Supabase Auth plugin settings, configure: Default page for unauthenticated users (the page non-logged-in users are redirected to — typically your login page). This page MUST be public. Set Redirect page after login (the page users land on after successful login — typically your app's dashboard or home page). Click 'Generate' to automatically create the `roles` table and `users_roles` join table in your Supabase database — these are needed for role-based access control later. Review the SMTP configuration notice: for production email delivery (signup confirmation, password reset), configure your own SMTP provider in the Supabase Dashboard → Authentication → Settings → SMTP Settings. Without custom SMTP, Supabase's shared email server has low rate limits and poor deliverability.

Expected result: The Supabase Auth plugin is connected to your project. The login page and dashboard page are set as redirect targets. The roles table exists in your Supabase database.

3

Build the login page with email and password

Create or navigate to your login page. This page must be set to Public in Page settings → Access control. Add a Form Container → inside it add: an Input element (type: email, name: 'email', required validation), an Input element (type: password, name: 'password', required validation), and a Button ('Sign in'). Add a workflow to the Form Container's On submit event → Action: Supabase Auth → Log in → bind Email to formContainer['formData'].email and Password to formContainer['formData'].password. Add a success branch: if login succeeds, the plugin automatically redirects to the page you configured. For explicit navigation: add Navigate action → your dashboard page. Add an error branch: Change variable value → 'loginError' String → 'Invalid email or password' → bind a Text element below the button to display this error message. The error text element's display should be bound to `loginError.length > 0`.

Expected result: The login page accepts email and password. On success, the user is redirected to the dashboard. On failure, an error message appears below the form.

4

Build the signup page

Create a signup page (also public). The signup form needs: email input, password input, optional confirm password input. Add a Form Container → On submit workflow → Supabase Auth → Sign up → bind Email and Password fields. If you are requiring password confirmation, add a custom validation formula on the confirm_password input: `formContainer['formData'].password === formContainer['formData'].confirm_password`. In Supabase, email confirmation is enabled by default — users receive an email and must click a confirmation link before they can log in. In this case, after signup, do not auto-redirect to the dashboard. Instead, show a message: 'Please check your email and click the confirmation link to activate your account.' If you want to disable email confirmation for faster onboarding: go to Supabase Dashboard → Authentication → Providers → Email → disable 'Confirm email'. Only do this for internal tools or during development — production apps should keep confirmation enabled to verify email addresses.

Expected result: New users can register. If email confirmation is enabled, they receive a confirmation email. If disabled, they are logged in immediately after signup.

5

Add social login with Google OAuth

Social login requires two steps: configuring the OAuth provider in Supabase (outside WeWeb), then calling it from WeWeb. OUTSIDE WEWEB — in Supabase Dashboard: go to Authentication → Providers → Google → toggle Enable. Create a Google OAuth app: go to console.cloud.google.com → APIs & Services → Credentials → Create OAuth 2.0 Client ID (Web application type). Authorized redirect URI: paste your Supabase callback URL shown in the Supabase Google provider settings (format: https://[project-ref].supabase.co/auth/v1/callback). Copy the Client ID and Client Secret from Google → paste into Supabase → Save. IN WEWEB: on your login page, add a Button ('Continue with Google'). Add a workflow: On click → Supabase Auth → Login with provider → select 'google' → Redirect to: your post-login page URL. The redirect page after OAuth login MUST be public. When the OAuth flow completes, Supabase redirects back to WeWeb with a token in the URL. WeWeb's Supabase Auth plugin reads this token automatically and logs the user in. For multiple social providers, repeat this process (GitHub, Apple, LinkedIn, etc.) — each requires its own OAuth app setup outside WeWeb.

Expected result: Clicking 'Continue with Google' opens a Google consent screen. After approval, the user is logged into your WeWeb app.

6

Implement password reset flow

Password reset requires a dedicated reset page and a two-step email flow. Step 1 — Request reset: Add a 'Forgot password?' link on the login page. It navigates to a Reset Password Request page (public). This page has a single email input and a submit button. On submit workflow: Supabase Auth → Reset password → bind Email to the input value. This triggers Supabase to send a password reset email. After the action, show a message: 'Check your email for a password reset link.' OUTSIDE WEWEB — in Supabase Dashboard: Authentication → Email Templates → Reset Password. The default template links to your Supabase auth URL. For WeWeb, change the redirect URL to your WeWeb reset confirmation page: `https://yourdomain.com/reset-confirm?token={{ .Token }}`. Step 2 — Set new password: Create a Reset Confirm page (public, URL: /reset-confirm). This page has a new password input and confirm password input. On page load workflow: extract the token from the URL query variable. On submit: Supabase Auth → Update user → bind new password. After success, navigate to the login page with a success message.

Expected result: Users receive a reset email. Clicking the link lands on your reset confirmation page where they enter a new password.

7

Access the current user's data in bindings and workflows

After successful login, WeWeb's Supabase Auth plugin stores the user object at `wwContext.user`. Access it in any binding formula throughout your app. Common bindings: Display user's name: `wwContext.user.user_metadata.full_name || wwContext.user.email`. Show/hide content based on login state: bind Conditional Rendering to `wwContext.user !== null`. The user's ID: `wwContext.user.id`. The user's email: `wwContext.user.email`. User roles (after using the Generate button): `wwContext.user.roles` (array of role objects). To use the current user's ID in a Supabase collection filter (e.g., fetch only this user's records): in the collection's Filters section, add: `user_id equals [plug icon] → wwContext.user?.id`. Enable 'Ignore if empty' so the collection doesn't run when the user is not logged in. Logout: add a workflow to any button: Supabase Auth → Log out → then Navigate to the login page. After logout, `wwContext.user` becomes null and any collection with user-based filters automatically refetches empty.

typescript
1// Injection point: binding formula examples for use throughout WeWeb
2
3// Check if user is logged in:
4wwContext.user !== null
5
6// Display user's name (with fallback to email):
7wwContext.user?.user_metadata?.full_name || wwContext.user?.email || 'Guest'
8
9// Check if user has a specific role:
10wwContext.user?.roles?.some(r => r.name === 'admin')
11
12// User's avatar URL (if set in user_metadata):
13wwContext.user?.user_metadata?.avatar_url
14
15// Filter a collection to the current user's records:
16// Collection filter: user_id equals wwContext.user?.id
17
18// Check if email is confirmed:
19wwContext.user?.email_confirmed_at !== null

Expected result: User data (name, email, roles, ID) is accessible in bindings throughout the app. Collections automatically filter to the current user's data.

Complete working example

auth-login-workflow.js
1// Injection point: Workflow → Custom JavaScript action
2// Use this to handle auth state on protected pages
3// Run this action in a Project workflow triggered 'On page load'
4// to redirect unauthenticated users away from protected pages
5
6// Note: WeWeb's Supabase Auth plugin handles this automatically
7// via the 'Default page for unauthenticated users' setting.
8// This custom JS is for more granular control (e.g., role-based redirects)
9
10const user = wwContext.user;
11
12if (!user) {
13 // User not logged in — will be handled by plugin redirect
14 // Return early, no action needed here
15 return { authenticated: false };
16}
17
18// Check if the user's email is confirmed
19if (!user.email_confirmed_at) {
20 // Redirect to an 'awaiting confirmation' page
21 return { authenticated: false, reason: 'email_not_confirmed' };
22}
23
24// Log user info for debugging (remove in production)
25console.log('Authenticated user:', user.id, user.email);
26console.log('User roles:', user.roles?.map(r => r.name).join(', '));
27
28return {
29 authenticated: true,
30 userId: user.id,
31 email: user.email,
32 isAdmin: user.roles?.some(r => r.name === 'admin') || false
33};

Common mistakes

Why it's a problem: Setting the OAuth callback redirect page as a protected (non-public) page, causing an infinite redirect loop

How to avoid: The page that users land on after social login (Google, GitHub, etc.) MUST be set to Public in Page settings → Access control. This is because the OAuth callback reads the authentication cookie before the user is fully logged in. If the landing page is protected, WeWeb redirects to login, which redirects to Google, creating a loop. After the auth cookie is set on the public redirect page, navigate the user to the protected dashboard.

Why it's a problem: Using WeWeb Auth (the built-in proof-of-concept auth) for a production app

How to avoid: WeWeb's own documentation explicitly marks WeWeb Auth as not suitable for production or large user bases. Switch to Supabase Auth, Auth0, or Xano Auth before launch. WeWeb Auth stores data in WeWeb's infrastructure, has limited features, and critically: deleting the plugin permanently deletes all users with no recovery.

Why it's a problem: Not configuring custom SMTP in Supabase, causing confirmation emails to fail or go to spam

How to avoid: Supabase's shared email service has strict rate limits (2 emails/hour on free tier) and low deliverability. For production: Supabase Dashboard → Authentication → Settings → SMTP Settings → enable custom SMTP → configure with Resend, SendGrid, or Postmark. Resend has a generous free tier (3,000 emails/month) and is the recommended choice in the WeWeb community.

Why it's a problem: Accessing wwContext.user before the auth plugin has initialized, causing null reference errors on page load

How to avoid: Use optional chaining in all user-related bindings: wwContext.user?.email instead of wwContext.user.email. For critical auth checks, add an 'Ignore if empty' condition or check wwContext.user !== null before the binding evaluation. The auth plugin initializes asynchronously — briefly, user may be null even for logged-in users during the initial page render.

Best practices

  • Use Supabase Auth for new projects — it integrates natively with the Supabase data source plugin and auto-forwards tokens to all database operations
  • Always configure the post-OAuth redirect page as Public — OAuth callbacks cannot land on protected pages
  • Set up custom SMTP in Supabase before going live — the shared email server is rate-limited and unreliable for production
  • Use the Generate button in the Supabase Auth plugin settings to auto-create the roles and users_roles tables before building RBAC
  • Guard all user-related bindings with optional chaining (user?.email) to prevent errors during the authentication initialization window
  • Store additional user profile data in Supabase's profiles table (not just user_metadata) — create a profiles table that references auth.users and populate it via a database trigger on user creation
  • Never rely solely on frontend auth state for data security — backend RLS policies are the true security layer

Still stuck?

Copy one of these prompts to get a personalized, step-by-step explanation.

ChatGPT Prompt

I'm setting up Supabase Auth in WeWeb for a SaaS app. I need: login with email/password, signup with email confirmation, and Google social login. What do I need to configure in the Supabase Dashboard outside WeWeb (OAuth app, SMTP, providers), and what workflow actions do I configure in WeWeb for each of these three flows? Also explain how to access the logged-in user's ID in a WeWeb collection filter.

WeWeb Prompt

In WeWeb with Supabase Auth installed, I want to build a login page that: (1) shows email/password inputs, (2) shows a Google login button, (3) shows an error message on failed login, (4) redirects to /dashboard on success. My Supabase project has Google provider already enabled. What WeWeb workflow actions, bindings, and page settings do I need to configure? The redirect page after Google OAuth is /auth-callback which I'll make public.

Frequently asked questions

Which authentication provider should I choose for my WeWeb project: Supabase Auth or Auth0?

Choose Supabase Auth unless you have specific enterprise requirements. Supabase Auth integrates natively with WeWeb's Supabase plugin, auto-forwards tokens to database operations, and is free for up to 50,000 MAU. Auth0 is the better choice when you need: SAML SSO for enterprise customers (Okta, Azure AD), advanced MFA requirements, compliance certifications beyond what Supabase offers, custom rules/actions in the auth pipeline, or your organization already uses Auth0 for other systems. Auth0 free tier is limited to 7,000 MAU.

How do I persist the logged-in user's session across page refreshes in WeWeb?

WeWeb's Supabase Auth plugin handles session persistence automatically. The session token is stored in localStorage and the plugin reads it on every page load. As long as the session has not expired (Supabase default: 1 hour access token, 7-day refresh window), the user remains logged in across refreshes and browser reopens. You do not need to implement any custom session persistence code.

Can WeWeb apps support multi-factor authentication (MFA)?

Supabase Auth added TOTP-based MFA (Google Authenticator, Authy) in 2024. Configure it in Supabase Dashboard → Authentication → Multi-Factor Authentication. WeWeb does not have a built-in MFA UI — you need to build the enrollment and verification pages manually: a 'Set up MFA' page with a QR code generator (Supabase provides the enrollment data), and a 'Verify MFA' step in your login flow that appears after password verification. Auth0 has more mature MFA support with built-in UI if advanced MFA is a core requirement.

How do I handle users who sign up with Google and later try to sign in with email/password?

By default, Supabase creates separate accounts for email and social login even with the same email address. To link accounts: enable 'Link accounts' in Supabase Dashboard → Authentication → Settings (if available in your Supabase version) or handle this in a Supabase Edge Function using the admin API to merge accounts. The simpler UX solution: on your login page, display only the login method the user originally signed up with. You can detect this by checking the user's app_metadata.provider field in Supabase, and showing/hiding the email form or Google button accordingly.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.