📖 Scenario: You are building a simple website using Astro. You want to protect a special page so only logged-in users can see it. To do this, you will create middleware that checks if a user is logged in before allowing access.
🎯 Goal: Create middleware in Astro that checks if a user is authenticated by looking for a cookie called authToken. If the cookie is missing, redirect the user to the login page.
📋 What You'll Learn
Create a middleware function in Astro
Check for a cookie named authToken
Redirect to /login if the cookie is missing
Allow access if the cookie is present
💡 Why This Matters
🌍 Real World
Websites often need to protect pages so only logged-in users can see them. Middleware helps check authentication before showing content.
💼 Career
Understanding middleware and authentication is important for web developers building secure applications.
Progress0 / 4 steps
1
Create the middleware file
Create a file named src/middleware/auth.ts and export an async function called onRequest that takes context as a parameter.
Astro
Hint
Middleware in Astro uses an exported onRequest function.
2
Check for the authToken cookie
Inside the onRequest function, create a variable called authToken that gets the cookie named authToken from context.cookies.
Astro
Hint
Use context.cookies.get('authToken') to read the cookie.
3
Redirect if authToken is missing
Add an if statement that checks if authToken is falsy. Inside the if, return a redirect response to /login using Response.redirect with status code 302.
Astro
Hint
Use if (!authToken) to check if the cookie is missing.
4
Allow access if authenticated
At the end of the onRequest function, return context.next() to allow the request to continue if the user is authenticated.
Astro
Hint
Use return context.next() to continue the request.
Practice
(1/5)
1. What is the main purpose of middleware for authentication in Astro?
easy
A. To fetch data from an external API after the page loads
B. To style the webpage with CSS before rendering
C. To check if a user is allowed to access certain pages before loading them
D. To optimize images automatically during build
Solution
Step 1: Understand middleware role
Middleware runs before page loads to control access.
Step 2: Identify authentication purpose
Authentication middleware checks user identity to allow or block access.
Final Answer:
To check if a user is allowed to access certain pages before loading them -> Option C
Quick Check:
Middleware controls access = A [OK]
Hint: Middleware controls access before page loads [OK]
Common Mistakes:
Confusing middleware with styling or data fetching
Thinking middleware runs after page loads
Assuming middleware optimizes images
2. Which is the correct way to allow access to the next middleware or page in Astro authentication middleware?
easy
A. return context.stop()
B. return context.skip()
C. return context.block()
D. return context.next()
Solution
Step 1: Recall middleware flow control
In Astro, calling context.next() passes control to next middleware or page.
Step 2: Identify correct method to continue
Only context.next() allows access; others are invalid or block.
Final Answer:
return context.next() -> Option D
Quick Check:
Allow access = context.next() [OK]
Hint: Use context.next() to continue middleware chain [OK]
Common Mistakes:
Using non-existent methods like context.stop()
Confusing block and skip with next
Omitting return keyword
3. Given this Astro middleware code snippet, what happens if the user is not authenticated?
export async function middleware(context) {
if (!context.cookies.get('authToken')) {
return new Response('Unauthorized', { status: 401 });
}
return context.next();
}
medium
A. The user sees a 401 Unauthorized response and page does not load
B. The user is redirected to the homepage
C. The middleware ignores the check and loads the page
D. The user is logged out automatically
Solution
Step 1: Analyze authentication check
The code checks if 'authToken' cookie exists; if not, returns 401 response.
Step 2: Understand middleware response effect
Returning a Response with status 401 stops page loading and shows unauthorized message.
Final Answer:
The user sees a 401 Unauthorized response and page does not load -> Option A
Quick Check:
Missing authToken = 401 response [OK]
Hint: Return Response with 401 to block unauthorized users [OK]
Common Mistakes:
Assuming middleware redirects automatically
Thinking page loads despite 401 response
Confusing logout with blocking access
4. Identify the error in this Astro middleware code for authentication:
export async function middleware(context) {
if (!context.cookies.get('authToken')) {
context.next();
}
return new Response('Unauthorized', { status: 401 });
}
medium
A. The Response status 401 should be 200 to allow access
B. context.next() is called but its result is not returned, so middleware blocks all requests
C. The cookie name 'authToken' is incorrect and causes a runtime error
D. Middleware functions cannot be async in Astro
Solution
Step 1: Check middleware flow control
context.next() must be returned to continue; here it is called but not returned.
Step 2: Understand effect of missing return
Since return is after if-block, middleware always returns 401 response, blocking all requests.
Final Answer:
context.next() is called but its result is not returned, so middleware blocks all requests -> Option B
Quick Check:
Return context.next() to allow access [OK]
Hint: Always return context.next() to continue middleware chain [OK]
Common Mistakes:
Calling context.next() without return
Misunderstanding cookie name importance
Thinking async is disallowed in middleware
5. You want to protect multiple private routes in Astro using middleware. Which approach correctly applies authentication middleware only to URLs starting with /dashboard or /settings?
hard
A. Check if context.url.pathname starts with '/dashboard' or '/settings' and run auth check only then
B. Apply middleware globally and always block access regardless of URL
C. Use middleware only on the homepage '/' to protect all routes
D. Check if context.url.pathname ends with '/dashboard' or '/settings' to run auth
Solution
Step 1: Understand route matching in middleware
Middleware can check context.url.pathname to target specific routes.
Step 2: Identify correct string method for prefix matching
Using startsWith matches routes beginning with '/dashboard' or '/settings'.
Step 3: Evaluate other options
Blocking all routes or checking endsWith is incorrect for this purpose.
Final Answer:
Check if context.url.pathname starts with '/dashboard' or '/settings' and run auth check only then -> Option A
Quick Check:
Use startsWith for route prefix matching [OK]
Hint: Use startsWith to target route prefixes in middleware [OK]
Common Mistakes:
Blocking all routes instead of specific ones
Using endsWith instead of startsWith
Applying middleware only on homepage
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.