Revoking JWT with Redis in NestJS
Introduction
In the previous article, I provided instructions on using NestJS with JWT, and you may also realize that if you use JWT, once a token is issued, it cannot be revoked. This means that if you have a token that hasn't expired yet, you can continue to use the service. For small systems that do not prioritize security, this might not be a major issue and can be simply resolved by deleting the token from the frontend when the user logs out.
However, if you need to build a system with extremely high security, where the token must be invalidated upon logout so that no one can use it to access the service, this article will guide you through how to achieve that.
To do this, we will use Redis (which I have already guided you on in this article) to store tokens that have not expired but are requested to be deleted. The storage duration for these tokens will be exactly the time remaining until they expire. Thus, after applying Redis, the operation of tokens will be as follows:
- If a token is used normally until it expires, it can no longer be used.
- If a token has not expired but the user logs out and requests that this token can no longer be used, we will store this token in Redis with a time-to-live equal to the remaining time until that token expires. When there is a request to continue using this token, we will check if it exists in Redis; if it does, we will not allow its use.
Here, we use Redis to achieve Instant Revocation, with extremely low latency because Redis reads/writes on RAM.
Prerequisites
You should review my previous article to grasp the basic information about JWT and have successfully started Valkey (Redis) before proceeding, as I will continue developing based on that project.
Detail
First, please update the jwt.guard.ts file
This code snippet acts as a "gatekeeper." After technically verifying the token's validity, it proceeds to look up in Redis whether this token is on the "blacklist" (logged out). If found in Redis, it will immediately deny access.
Next, update the auth.service.ts file
This service handles the core business logic for logout. When a user calls the /logout api, the system calculates the remaining time of the token (before it naturally expires) and puts that token into Redis to invalidate it for that remaining duration.
Automatic cleanup: Thanks to Redis's EX (Expire) mechanism, expired tokens will automatically disappear from memory, preventing Redis from bloating over time.
Update the auth.controller.ts file to add the /logout api
Please check again with Postman, after logging out, you will no longer be able to reuse that access token.
Happy coding!
Comments
Post a Comment