Bird
Raised Fist0
Supabasecloud~10 mins

Protected routes in frontend in Supabase - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Protected routes in frontend
User tries to access route
↓
Check if user is logged in
↓
User stays [User logs in
When a user tries to visit a protected page, the app checks if they are logged in. If yes, it shows the page. If not, it sends them to login.
Execution Sample
Supabase
const { data: { session } } = await supabase.auth.getSession();
if (!session) {
  redirect('/login');
} else {
  renderProtectedPage();
}
This code checks if the user session exists. If not, it redirects to login. Otherwise, it shows the protected page.
Process Table
StepActionSession Exists?Branch TakenResult
1User tries to access /dashboardUnknownCheck sessionProceed to check session
2Check session with supabase.auth.getSession()NoRedirect to /loginUser sent to login page
3User tries to access /dashboard again after loginYesRender protected pageDashboard content shown
4User logs outNoRedirect to /login on next accessUser must login again
5User tries to access /dashboard after logoutNoRedirect to /loginUser sent to login page
💡 Execution stops when user is either shown protected content or redirected to login.
Status Tracker
VariableStartAfter Step 2After Step 3After Step 4After Step 5
sessionundefinednullobject with user infonullnull
Key Moments - 3 Insights
Why does the app redirect to login even if the user was logged in before?
Because the session check (step 2) returned null, meaning no active session. The app must confirm session each time before showing protected content.
What happens if the user logs out but tries to access the protected route again?
At step 5, session is null, so the app redirects to login again, preventing access without login.
Why do we check session before rendering the protected page?
To ensure only authenticated users see protected content, avoiding unauthorized access (see step 2 and 3).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the session value after step 2?
Anull
Bundefined
Cobject with user info
Dfalse
💡 Hint
Check the 'session' variable in variable_tracker after step 2.
At which step does the app render the protected page?
AStep 2
BStep 4
CStep 3
DStep 5
💡 Hint
Look at the 'Branch Taken' and 'Result' columns in execution_table.
If the user never logs out, what would happen at step 5?
ARedirect to login
BRender protected page
CShow error message
DSession becomes null
💡 Hint
Refer to variable_tracker and execution_table for session state after login.
Concept Snapshot
Protected routes check if a user is logged in before showing content.
Use supabase.auth.getSession() to get session info.
If no session, redirect to login page.
If session exists, render protected content.
Always verify session on route access to secure pages.
Full Transcript
Protected routes in frontend mean only logged-in users can see certain pages. When a user tries to open a protected page, the app checks if they have a valid session using supabase.auth.getSession(). If the session is missing, the app sends the user to the login page. After logging in, the user can access the protected page. If the user logs out, the session is cleared, and the app again redirects to login on next access. This flow ensures only authorized users see protected content.

Practice

(1/5)
1. What is the main purpose of protected routes in a frontend application using Supabase?
easy
A. To allow only logged-in users to access certain pages
B. To speed up page loading times
C. To store user data permanently
D. To change the app's theme automatically

Solution

  1. Step 1: Understand what protected routes do

    Protected routes restrict access to certain pages so only authorized users can see them.
  2. Step 2: Connect with Supabase session usage

    Supabase sessions help check if a user is logged in, enabling route protection.
  3. Final Answer:

    To allow only logged-in users to access certain pages -> Option A
  4. Quick Check:

    Protected routes = restrict access to logged-in users [OK]
Hint: Protected routes block access unless user is logged in [OK]
Common Mistakes:
  • Thinking protected routes speed up loading
  • Confusing route protection with data storage
  • Assuming protected routes change app appearance
2. Which of the following is the correct way to check if a user is logged in using Supabase in frontend code?
easy
A. const user = supabase.auth.getUser()
B. const user = supabase.session()
C. const user = supabase.auth.session()
D. const user = supabase.auth.getSession()

Solution

  1. Step 1: Identify Supabase method for session retrieval

    Supabase's current method to get session info is auth.getSession(), which returns user session data.
  2. Step 2: Compare options with official API

    Options A, B, and C are outdated or incorrect method names; only getSession() is valid.
  3. Final Answer:

    const user = supabase.auth.getSession() -> Option D
  4. Quick Check:

    Use auth.getSession() to check login [OK]
Hint: Use supabase.auth.getSession() to get current user session [OK]
Common Mistakes:
  • Using deprecated methods like auth.session()
  • Calling supabase.session() which does not exist
  • Confusing getUser() with getSession()
3. Given this React snippet using Supabase, what will happen if the user is not logged in?
const session = supabase.auth.getSession();
if (!session) {
  navigate('/login');
} else {
  showDashboard();
}
medium
A. The dashboard is shown regardless
B. An error is thrown because getSession() is async
C. The user is redirected to the login page
D. Nothing happens; the page stays the same

Solution

  1. Step 1: Understand getSession() behavior

    supabase.auth.getSession() is an asynchronous function returning a Promise, so calling it without await assigns a Promise object to session, not session data.
  2. Step 2: Analyze the code flow

    A Promise object is truthy, so if (!session) evaluates to false, and showDashboard() executes regardless of login status.
  3. Final Answer:

    The dashboard is shown regardless -> Option A
  4. Quick Check:

    Async getSession() without await returns truthy Promise [OK]
Hint: Remember to await async getSession() calls [OK]
Common Mistakes:
  • Treating async getSession() as synchronous
  • Assuming session is null if user not logged in
  • Ignoring Promise returned by getSession()
4. You wrote this code to protect a route but it redirects even logged-in users to login:
const { data: session } = supabase.auth.getSession();
if (!session) {
  window.location.href = '/login';
}

What is the main issue?
medium
A. session is always truthy even if user is logged out
B. window.location.href cannot redirect pages
C. getSession() is asynchronous and must be awaited
D. You must use supabase.auth.getUser() instead

Solution

  1. Step 1: Check getSession() usage

    supabase.auth.getSession() returns a Promise and must be awaited or handled asynchronously to get session data.
  2. Step 2: Understand destructuring without await

    Destructuring data from a Promise without await results in undefined or incorrect values, so session is not properly checked.
  3. Final Answer:

    getSession() is asynchronous and must be awaited -> Option C
  4. Quick Check:

    Always await async getSession() calls [OK]
Hint: Always await async Supabase calls to get real data [OK]
Common Mistakes:
  • Not awaiting async functions
  • Thinking window.location.href can't redirect
  • Using getUser() instead of getSession() incorrectly
5. You want to protect a React page so only logged-in users can see it. Which approach correctly implements this using Supabase's session and React hooks?
function ProtectedPage() {
  const [session, setSession] = React.useState(null);

  React.useEffect(() => {
    const getSession = async () => {
      const { data } = await supabase.auth.getSession();
      setSession(data.session);
      if (!data.session) {
        navigate('/login');
      }
    };
    getSession();
  }, []);

  if (!session) return <p>Loading...</p>;
  return <div>Welcome to protected content!</div>;
}
hard
A. The navigate call should be outside the async function
B. This code correctly protects the page by redirecting unauthenticated users
C. The code should call supabase.auth.getUser() instead of getSession()
D. The session state should be initialized with supabase.auth.getSession() synchronously

Solution

  1. Step 1: Analyze async session retrieval in useEffect

    The code correctly uses an async function inside useEffect to get the session and update state.
  2. Step 2: Check redirect logic for unauthenticated users

    If no session exists, the code calls navigate('/login') to redirect users, protecting the page.
  3. Step 3: Confirm loading state handling

    While session is null, it shows a loading message, preventing content flash before redirect.
  4. Final Answer:

    This code correctly protects the page by redirecting unauthenticated users -> Option B
  5. Quick Check:

    Async session check + redirect = protected route [OK]
Hint: Use async useEffect with redirect on no session [OK]
Common Mistakes:
  • Using getUser() instead of getSession() for session check
  • Calling navigate outside async context incorrectly
  • Initializing session state synchronously causing errors
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard