Bird
Raised Fist0
NestJSframework~10 mins

JWT authentication guard in NestJS - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - JWT authentication guard
Request comes in
↓
Guard intercepts request
↓
Extract JWT from header
↓
Verify JWT validity
↓
Allow access
↓
Controller handles request
The guard checks the request for a JWT token, verifies it, and either allows or denies access based on validity.
Execution Sample
NestJS
canActivate(context: ExecutionContext) {
  const request = context.switchToHttp().getRequest();
  const token = this.extractToken(request);
  return this.jwtService.verifyAsync(token).then(() => true).catch(() => false);
}
This code checks if the JWT token in the request is valid and returns true or false accordingly.
Execution Table
StepActionInputResultNext Step
1Guard intercepts requestIncoming HTTP requestRequest object extractedExtract JWT token
2Extract JWT tokenRequest headersJWT token string or undefinedVerify JWT token
3Verify JWT tokenJWT token string or undefinedToken valid or invalidAllow or deny access
4Allow accessToken validReturn trueController handles request
5Deny accessToken invalid or missingReturn falseRequest denied with 401
💡 Execution stops after returning true or false to allow or deny access.
Variable Tracker
VariableStartAfter Step 2After Step 3Final
requestundefinedHTTP request objectHTTP request objectHTTP request object
tokenundefinedJWT token string or undefinedJWT token string or undefinedJWT token string or undefined
verificationResultundefinedundefinedtrue or falsetrue or false
Key Moments - 3 Insights
What happens if the JWT token is missing from the request?
At Step 2 in the execution_table, if the token is undefined, the verification at Step 3 fails, leading to denial of access at Step 5.
Why does the guard return true or false instead of throwing an error?
The guard returns true or false to signal if access is allowed or denied. Returning false triggers NestJS to respond with 401 Unauthorized automatically, as shown in Step 5.
How does the guard extract the JWT token from the request?
At Step 2, the guard reads the Authorization header from the request and extracts the token part, usually after 'Bearer '. If missing, token is undefined.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the result at Step 3 if the token is invalid?
AToken invalid
BToken valid
CToken missing
DToken expired
💡 Hint
Check Step 3 'Result' column in the execution_table for invalid token cases.
At which step does the guard decide to deny access?
AStep 3
BStep 5
CStep 4
DStep 2
💡 Hint
Look at the 'Next Step' and 'Action' columns in the execution_table for denial.
If the token is missing, what will the verificationResult variable be after Step 3?
Atrue
Bundefined
Cfalse
Dnull
💡 Hint
Refer to variable_tracker for verificationResult after Step 3 when token is missing.
Concept Snapshot
JWT Authentication Guard in NestJS:
- Intercepts incoming requests
- Extracts JWT token from Authorization header
- Verifies token validity asynchronously
- Returns true to allow access, false to deny
- Denied access triggers 401 Unauthorized response
Full Transcript
A JWT authentication guard in NestJS works by intercepting incoming HTTP requests. It extracts the JWT token from the Authorization header. Then it verifies the token asynchronously using the JWT service. If the token is valid, the guard returns true, allowing the request to proceed to the controller. If the token is missing or invalid, the guard returns false, which causes NestJS to respond with a 401 Unauthorized error. This process ensures only authenticated users can access protected routes.

Practice

(1/5)
1. What is the main purpose of a JWT authentication guard in a NestJS application?
easy
A. To verify the JWT token and protect routes from unauthorized access
B. To generate new JWT tokens for users
C. To store user data in the database
D. To handle HTTP request logging

Solution

  1. Step 1: Understand the role of JWT guard

    The JWT authentication guard checks if the incoming request has a valid JWT token.
  2. Step 2: Identify what the guard protects

    The guard protects routes by allowing access only if the token is valid, preventing unauthorized users.
  3. Final Answer:

    To verify the JWT token and protect routes from unauthorized access -> Option A
  4. Quick Check:

    JWT guard = verify token and protect routes [OK]
Hint: JWT guard checks token validity to protect routes [OK]
Common Mistakes:
  • Confusing guard with token generation
  • Thinking guard stores user data
  • Assuming guard handles logging
2. Which of the following is the correct way to apply a JWT authentication guard to a controller route in NestJS?
easy
A. Use @Get('jwt') decorator on the route
B. @Controller('jwt') before the class
C. Inject JwtService directly in the route handler
D. @UseGuards(AuthGuard('jwt')) before the route handler method

Solution

  1. Step 1: Recall how guards are applied in NestJS

    Guards are applied using the @UseGuards() decorator before route handlers or controllers.
  2. Step 2: Identify the correct guard usage for JWT

    The JWT guard is used as AuthGuard('jwt') inside @UseGuards decorator.
  3. Final Answer:

    @UseGuards(AuthGuard('jwt')) before the route handler method -> Option D
  4. Quick Check:

    @UseGuards(AuthGuard('jwt')) = correct syntax [OK]
Hint: Use @UseGuards(AuthGuard('jwt')) to protect routes [OK]
Common Mistakes:
  • Using @Controller('jwt') instead of guard
  • Injecting JwtService instead of using guard
  • Confusing route decorators with guards
3. Given the following NestJS JWT guard code snippet, what will happen if the request has no Authorization header?
canActivate(context: ExecutionContext) {
  const request = context.switchToHttp().getRequest();
  const authHeader = request.headers['authorization'];
  if (!authHeader) {
    throw new UnauthorizedException('No token provided');
  }
  // further token validation...
  return true;
}
medium
A. The guard allows the request to proceed
B. The guard throws an UnauthorizedException with message 'No token provided'
C. The guard returns false silently
D. The guard logs a warning but allows access

Solution

  1. Step 1: Analyze the condition for missing Authorization header

    If the header is missing, the code throws UnauthorizedException with a specific message.
  2. Step 2: Understand the effect of throwing UnauthorizedException

    Throwing this exception stops the request and returns an HTTP 401 error to the client.
  3. Final Answer:

    The guard throws an UnauthorizedException with message 'No token provided' -> Option B
  4. Quick Check:

    No Authorization header = UnauthorizedException thrown [OK]
Hint: Missing token causes UnauthorizedException throw [OK]
Common Mistakes:
  • Assuming guard returns false instead of throwing
  • Thinking request proceeds without token
  • Confusing logging with exception throwing
4. Identify the error in this JWT guard snippet that causes it to always allow access even with invalid tokens:
async canActivate(context: ExecutionContext) {
  const request = context.switchToHttp().getRequest();
  const token = request.headers['authorization']?.split(' ')[1];
  if (!token) return false;
  try {
    const payload = await this.jwtService.verifyAsync(token);
    request.user = payload;
  } catch {
    return true;
  }
  return true;
}
medium
A. The method should not be async
B. The token extraction splits incorrectly
C. The catch block returns true, allowing access on token errors
D. The user is not attached to the request

Solution

  1. Step 1: Review the catch block behavior

    The catch block returns true, which means even if token verification fails, access is allowed.
  2. Step 2: Understand correct error handling in guards

    On verification failure, the guard should deny access by returning false or throwing an exception.
  3. Final Answer:

    The catch block returns true, allowing access on token errors -> Option C
  4. Quick Check:

    Catch returning true = always allow access [OK]
Hint: Catch block must deny access, not allow it [OK]
Common Mistakes:
  • Returning true in catch block
  • Ignoring token verification errors
  • Not attaching user to request
5. You want to create a custom JWT authentication guard that extracts the user from the token and adds a custom property isAdmin based on the user's role. Which approach correctly extends the default JWT guard to achieve this?
hard
A. Extend AuthGuard('jwt'), override handleRequest to add isAdmin to user, then return user
B. Create a new guard without extending AuthGuard and manually decode token
C. Use a middleware instead of a guard to add isAdmin property
D. Override canActivate to return true always and add isAdmin in controller

Solution

  1. Step 1: Understand extending AuthGuard('jwt')

    Extending the default JWT guard allows reuse of token validation logic.
  2. Step 2: Override handleRequest to customize user object

    handleRequest receives the validated user; adding isAdmin here modifies the user before passing it on.
  3. Step 3: Return the modified user to allow access

    Returning the user with isAdmin set ensures the controller can access this property safely.
  4. Final Answer:

    Extend AuthGuard('jwt'), override handleRequest to add isAdmin to user, then return user -> Option A
  5. Quick Check:

    Extend guard + override handleRequest = customize user [OK]
Hint: Extend AuthGuard and override handleRequest to customize user [OK]
Common Mistakes:
  • Not extending AuthGuard and duplicating logic
  • Using middleware instead of guard for auth
  • Overriding canActivate incorrectly
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