Protected routes in frontend in Supabase - Time & Space Complexity
When using protected routes in a frontend app with Supabase, we want to know how the time to check user access grows as the app handles more pages or users.
We ask: How does the number of checks or API calls change as the app scales?
Analyze the time complexity of this simple protected route check.
// Check user session before showing page
const { data: { session } } = await supabase.auth.getSession();
if (!session) {
redirectToLogin();
} else {
showProtectedPage();
}
This code checks if a user is logged in before allowing access to a page.
Look at what happens repeatedly when users navigate protected pages.
- Primary operation: Calling
supabase.auth.getSession()to check user login status. - How many times: Once per page load or route change that requires protection.
As the number of protected pages a user visits grows, the number of session checks grows the same way.
| Input Size (n) | Approx. Api Calls/Operations |
|---|---|
| 10 pages visited | 10 session checks |
| 100 pages visited | 100 session checks |
| 1000 pages visited | 1000 session checks |
Pattern observation: The number of checks grows directly with the number of protected pages visited.
Time Complexity: O(n)
This means the time spent checking user access grows in a straight line with the number of protected pages visited.
[X] Wrong: "Checking the user session once means no more checks are needed for other pages."
[OK] Correct: Each protected page load usually triggers a new session check to ensure the user is still logged in and authorized.
Understanding how protected route checks scale helps you design smooth user experiences and efficient apps. This skill shows you can think about app behavior as it grows.
What if we cached the user session after the first check? How would the time complexity change?
Practice
Solution
Step 1: Understand what protected routes do
Protected routes restrict access to certain pages so only authorized users can see them.Step 2: Connect with Supabase session usage
Supabase sessions help check if a user is logged in, enabling route protection.Final Answer:
To allow only logged-in users to access certain pages -> Option AQuick Check:
Protected routes = restrict access to logged-in users [OK]
- Thinking protected routes speed up loading
- Confusing route protection with data storage
- Assuming protected routes change app appearance
Solution
Step 1: Identify Supabase method for session retrieval
Supabase's current method to get session info is auth.getSession(), which returns user session data.Step 2: Compare options with official API
Options A, B, and C are outdated or incorrect method names; only getSession() is valid.Final Answer:
const user = supabase.auth.getSession() -> Option DQuick Check:
Use auth.getSession() to check login [OK]
- Using deprecated methods like auth.session()
- Calling supabase.session() which does not exist
- Confusing getUser() with getSession()
const session = supabase.auth.getSession();
if (!session) {
navigate('/login');
} else {
showDashboard();
}Solution
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.Step 2: Analyze the code flow
A Promise object is truthy, so if (!session) evaluates to false, and showDashboard() executes regardless of login status.Final Answer:
The dashboard is shown regardless -> Option AQuick Check:
Async getSession() without await returns truthy Promise [OK]
- Treating async getSession() as synchronous
- Assuming session is null if user not logged in
- Ignoring Promise returned by getSession()
const { data: session } = supabase.auth.getSession();
if (!session) {
window.location.href = '/login';
}What is the main issue?
Solution
Step 1: Check getSession() usage
supabase.auth.getSession() returns a Promise and must be awaited or handled asynchronously to get session data.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.Final Answer:
getSession() is asynchronous and must be awaited -> Option CQuick Check:
Always await async getSession() calls [OK]
- Not awaiting async functions
- Thinking window.location.href can't redirect
- Using getUser() instead of getSession() incorrectly
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>;
}Solution
Step 1: Analyze async session retrieval in useEffect
The code correctly uses an async function inside useEffect to get the session and update state.Step 2: Check redirect logic for unauthenticated users
If no session exists, the code calls navigate('/login') to redirect users, protecting the page.Step 3: Confirm loading state handling
While session is null, it shows a loading message, preventing content flash before redirect.Final Answer:
This code correctly protects the page by redirecting unauthenticated users -> Option BQuick Check:
Async session check + redirect = protected route [OK]
- Using getUser() instead of getSession() for session check
- Calling navigate outside async context incorrectly
- Initializing session state synchronously causing errors
Ready to prove it?
Pass the test and this pattern moves unknown
