What if your app could instantly know if a login is safe or suspicious without bothering the user?
Why Context-based authentication in GraphQL? - Purpose & Use Cases
Imagine you have a website where users log in, but you want to check their location, device, or time before letting them access sensitive data. Doing this by hand means checking each detail separately every time someone tries to log in.
Manually verifying each user's context is slow and easy to mess up. You might forget a check or mix up conditions, causing security holes or blocking real users by mistake.
Context-based authentication lets your system automatically check all these details together before allowing access. It makes security smarter and smoother without extra manual work.
if (user.isLoggedIn) { if (user.location == 'office') { allowAccess(); } }
query {
authenticateUser(context: { location: "office", device: "trusted" }) {
accessGranted
}
}It enables secure, flexible access control that adapts to who the user is and where or how they connect.
For example, a bank app might allow full access only if the user logs in from their usual city and device, blocking suspicious attempts automatically.
Manual checks are slow and error-prone.
Context-based authentication automates smart security decisions.
This approach protects users and data more effectively.
Practice
Solution
Step 1: Understand context-based authentication
It uses information from the request, like tokens, to verify who the user is.Step 2: Identify the main goal
The goal is to check user identity to allow or deny access to data.Final Answer:
To verify user identity using request information -> Option BQuick Check:
Context-based authentication = verify user identity [OK]
- Thinking it speeds up queries
- Confusing with data formatting
- Assuming it caches results
Solution
Step 1: Identify how context receives request info
Context function receives an object with request (req) and response (res).Step 2: Correctly extract user from request
User info is usually attached to req, so context: ({ req }) => ({ user: req.user }) is correct.Final Answer:
context: ({ req }) => ({ user: req.user }) -> Option AQuick Check:
Context uses req.user = context: ({ req }) => ({ user: req.user }) [OK]
- Using res instead of req
- Passing user as argument instead of req
- Setting static user instead of dynamic
context.user is { id: 5, role: 'admin' }?
resolve(parent, args, context) {
if (context.user?.role === 'admin') {
return 'Access granted';
} else {
return 'Access denied';
}
}Solution
Step 1: Check user role in context
The code checks if context.user.role equals 'admin'. Given context.user.role is 'admin', condition is true.Step 2: Determine returned string
Since condition is true, the resolver returns 'Access granted'.Final Answer:
'Access granted' -> Option CQuick Check:
context.user.role === 'admin' -> 'Access granted' [OK]
- Ignoring optional chaining and assuming error
- Confusing role values
- Assuming null return
const server = new ApolloServer({
typeDefs,
resolvers,
context: (req) => {
const user = authenticate(req.headers.authorization);
return { user };
}
});Solution
Step 1: Check context function parameter
ApolloServer passes an object with req property, so context should destructure it as ({ req }).Step 2: Identify correct usage of authorization header
Authorization header is accessed via req.headers.authorization, so destructuring is needed.Final Answer:
The context function should destructure req as ({ req }) -> Option AQuick Check:
Context param = ({ req }) not (req) [OK]
- Using req directly without destructuring
- Assuming authenticate is missing error
- Returning user instead of object
resolve(parent, args, context) {
// args.id is the data owner ID
// context.user has id and role
???
}Solution
Step 1: Understand access rules
Access is allowed if user owns data (user.id === args.id) or user is admin (role === 'admin').Step 2: Check condition logic
if (context.user.id === args.id || context.user.role === 'admin') { return 'Allowed'; } else { return 'Denied'; } correctly uses OR (||) to allow access if either condition is true.Final Answer:
if (context.user.id === args.id || context.user.role === 'admin') { return 'Allowed'; } else { return 'Denied'; } -> Option DQuick Check:
Owner or admin -> allow access [OK]
- Using AND instead of OR
- Denying admins access
- Ignoring user ID check
Ready to prove it?
Pass the test and this pattern moves unknown
