Session-based authentication helps keep users logged in by saving their login info on the server. It makes sure only the right people can access protected parts of your app.
Session-based authentication in NestJS
import { Module } from '@nestjs/common'; import * as cookieParser from 'cookie-parser'; import * as session from 'express-session'; @Module({ // Session configured in bootstrap }) export class AppModule {} // In main.ts or bootstrap: /* app.use(cookieParser()); app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: false, })); */ // In your controller import { Controller, Get, Req, Res } from '@nestjs/common'; import { Request, Response } from 'express'; @Controller() export class AuthController { @Get('login') login(@Req() req: Request, @Res() res: Response) { req.session.user = { id: 1, name: 'Alice' }; res.send('Logged in'); } @Get('profile') profile(@Req() req: Request) { if (req.session.user) { return req.session.user; } return 'Not logged in'; } }
Configure cookie-parser and express-session middleware in the NestJS bootstrap() function.
Store user info in req.session to keep it across requests.
req.session.user = { id: 1, name: 'Alice' };if (req.session.user) { // user is logged in }
req.session.destroy(() => {
// session cleared, user logged out
});This simple NestJS app uses session-based authentication. When you visit /login, it saves user info in the session. Visiting /profile shows the user info if logged in. Visiting /logout clears the session.
import { Module, Controller, Get, Req, Res } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import * as cookieParser from 'cookie-parser'; import * as session from 'express-session'; import { Request, Response } from 'express'; @Controller() class AuthController { @Get('login') login(@Req() req: Request, @Res() res: Response) { req.session.user = { id: 1, name: 'Alice' }; res.send('Logged in'); } @Get('profile') profile(@Req() req: Request) { if (req.session.user) { return req.session.user; } return 'Not logged in'; } @Get('logout') logout(@Req() req: Request, @Res() res: Response) { req.session.destroy((err) => { if (err) { return res.status(500).send('Error logging out'); } res.send('Logged out'); }); } } @Module({ controllers: [AuthController], }) class AppModule {} async function bootstrap() { const app = await NestFactory.create(AppModule); app.use(cookieParser()); app.use(session({ secret: 'my-secret-key', resave: false, saveUninitialized: false, })); await app.listen(3000); } bootstrap();
Sessions store data on the server, so users can't change their login info directly.
Always use a strong secret key to keep sessions secure.
Session data is temporary and usually expires after some time or when the user logs out.
Session-based authentication keeps user info on the server to track login status.
Configure express-session in NestJS to manage sessions.
Store and check user info in req.session to control access.
Practice
Solution
Step 1: Understand session-based authentication
Session-based authentication stores user info on the server to track login status across requests.Step 2: Compare options with session concept
Only To keep user login information on the server for tracking user sessions describes storing user login info on the server, which matches session-based authentication.Final Answer:
To keep user login information on the server for tracking user sessions -> Option AQuick Check:
Session stores user info on server = C [OK]
- Confusing sessions with token storage
- Thinking sessions store passwords in browser
- Believing credentials are sent every request without storage
Solution
Step 1: Identify correct package for session in NestJS
The official session support in NestJS is provided by '@nestjs/session'.Step 2: Check import statements
Only import { SessionModule } from '@nestjs/session'; imports SessionModule from '@nestjs/session', which is correct syntax.Final Answer:
import { SessionModule } from '@nestjs/session'; -> Option AQuick Check:
SessionModule from '@nestjs/session' = D [OK]
- Importing SessionModule from '@nestjs/common'
- Confusing express-session with NestJS module import
- Using incorrect package names
/profile?
import { Controller, Get, Req } from '@nestjs/common';
@Controller()
export class AppController {
@Get('profile')
getProfile(@Req() req) {
if (req.session.user) {
return `Hello, ${req.session.user.name}`;
} else {
return 'Not logged in';
}
}
}Solution
Step 1: Check session user existence
The code checks if req.session.user exists to decide output.Step 2: Understand output when user exists
If user exists with name 'Alice', it returns "Hello, Alice" string.Final Answer:
"Hello, Alice" if req.session.user.name is 'Alice' -> Option DQuick Check:
Session user present returns greeting = A [OK]
- Assuming req.session is always undefined
- Ignoring the user existence check
- Confusing output strings
import { Module } from '@nestjs/common';
import { SessionModule } from '@nestjs/session';
@Module({
imports: [
SessionModule.forRoot({
secret: 'mySecret',
resave: false,
saveUninitialized: true,
}),
],
})
export class AppModule {}Solution
Step 1: Review SessionModule options
In '@nestjs/session', options like 'resave' and 'saveUninitialized' are not valid; they belong to express-session directly.Step 2: Identify correct option usage
SessionModule expects options like 'secret' and 'cookie', but not 'resave' or 'saveUninitialized'.Final Answer:
'resave' and 'saveUninitialized' are not valid options for SessionModule -> Option CQuick Check:
Invalid options in SessionModule config = B [OK]
- Adding express-session options directly to SessionModule
- Confusing 'forRoot' with 'register'
- Ignoring required cookie config
import { Controller, Get, Req, Res } from '@nestjs/common';
import { Response, Request } from 'express';
@Controller()
export class AppController {
@Get('dashboard')
dashboard(@Req() req: Request, @Res() res: Response) {
// What should go here?
}
}Solution
Step 1: Check if user is logged in via session
We verify if req.session.user exists; if not, deny access with 401 status.Step 2: Return welcome message if user exists
If user exists, send a welcome message with their name.Final Answer:
if (!req.session.user) { return res.status(401).send('Unauthorized'); } return res.send('Welcome ' + req.session.user.name); -> Option BQuick Check:
Check session user, deny if missing = A [OK]
- Throwing errors instead of sending HTTP response
- Checking only if req.session exists, not user
- Reversing logic for authorization
Ready to prove it?
Pass the test and this pattern moves unknown
