Challenge - 5 Problems
Refresh Token Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate2:00remaining
What happens when a refresh token is expired in this NestJS service?
Consider this NestJS AuthService method that handles refresh tokens. What will be the result if the refresh token is expired?
NestJS
async refreshToken(userId: string, refreshToken: string) { const user = await this.userService.findById(userId); if (!user || user.refreshToken !== refreshToken) { throw new UnauthorizedException('Invalid refresh token'); } try { const payload = this.jwtService.verify(refreshToken); const newAccessToken = this.jwtService.sign({ sub: userId }); return { accessToken: newAccessToken }; } catch (e) { throw new UnauthorizedException('Refresh token expired'); } }
Attempts:
2 left
💡 Hint
Look at the try-catch block and what happens when jwtService.verify fails.
✗ Incorrect
When the refresh token is expired, jwtService.verify throws an error caught by the catch block, which then throws UnauthorizedException with message 'Refresh token expired'.
📝 Syntax
intermediate2:00remaining
Which option correctly defines a NestJS guard to check refresh token validity?
You want to create a guard that checks if the refresh token in the request headers is valid. Which code snippet is syntactically correct and follows NestJS patterns?
Attempts:
2 left
💡 Hint
Check for correct decorator usage and method signatures.
✗ Incorrect
Option D correctly imports Injectable and CanActivate, uses @Injectable() decorator, and implements canActivate with proper context usage.
❓ state_output
advanced2:00remaining
What is the output of this refresh token service method after multiple calls?
Given this simplified NestJS AuthService snippet, what will be the value of user.refreshToken after calling refreshToken twice with the same initial refresh token?
NestJS
class AuthService { constructor(private userService) {} async refreshToken(userId, refreshToken) { const user = await this.userService.findById(userId); if (!user || user.refreshToken !== refreshToken) { throw new Error('Invalid refresh token'); } const newRefreshToken = 'new-token-' + Math.random(); user.refreshToken = newRefreshToken; await this.userService.update(userId, { refreshToken: newRefreshToken }); return { accessToken: 'access-token', refreshToken: newRefreshToken }; } } // Initial user.refreshToken = 'initial-token' // Call 1: refreshToken(userId, 'initial-token') // Call 2: refreshToken(userId, 'initial-token')
Attempts:
2 left
💡 Hint
Think about how the stored refresh token changes after the first call.
✗ Incorrect
After the first call, user.refreshToken is updated to a new random token. The second call uses the old token, which no longer matches, causing an error.
🔧 Debug
advanced2:00remaining
Why does this NestJS refresh token validation always fail?
Look at this code snippet from a NestJS AuthService. The refresh token validation always fails even with a correct token. What is the bug?
NestJS
async validateRefreshToken(userId: string, token: string) { const user = await this.userService.findById(userId); if (!user) return false; try { this.jwtService.verify(token, { secret: process.env.JWT_SECRET }); } catch { return false; } return user.refreshToken === token; }
Attempts:
2 left
💡 Hint
Check how jwtService.verify behaves on invalid tokens.
✗ Incorrect
jwtService.verify throws an exception if the token is invalid. Using it as a boolean without try-catch causes the method to fail unexpectedly.
🧠 Conceptual
expert2:00remaining
Which statement best describes the security benefit of rotating refresh tokens in NestJS?
In a NestJS app implementing refresh token rotation, what is the main security advantage of issuing a new refresh token on each refresh request?
Attempts:
2 left
💡 Hint
Think about what happens if a refresh token is stolen and rotation is used.
✗ Incorrect
Rotating refresh tokens means each token can only be used once, so if a token is stolen, it quickly becomes useless, improving security.