NestJS is a popular framework for building scalable and maintainable server-side applications using TypeScript. It provides a solid foundation for developing Node.js applications with a modular architecture and a focus on dependency injection.
Passport is a flexible authentication middleware for Node.js that is often used in conjunction with frameworks like NestJS. It provides a simple and consistent way to handle authentication strategies, including OAuth2, which is a widely used protocol for authentication and authorization.
To integrate Google OAuth2 with Passport in a NestJS application, you’ll need to perform the following steps:
- Install the required dependencies
:
npm install @nestjs/passport passport passport-google-oauth20
Create a Google OAuth2 strategy file. In this file, you’ll configure Passport to use the Google OAuth2 strategy and define the necessary callback functions. For example, create a file named google.strategy.ts
with the following content:
import { Injectable } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { Strategy, VerifyCallback } from 'passport-google-oauth20'; import { ConfigService } from '@nestjs/config'; @Injectable() export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { constructor(private readonly configService: ConfigService) { super({ clientID: configService.get('GOOGLE_CLIENT_ID'), clientSecret: configService.get('GOOGLE_CLIENT_SECRET'), callbackURL: configService.get('GOOGLE_CALLBACK_URL'), scope: ['email', 'profile'], }); } async validate( accessToken: string, refreshToken: string, profile: any, done: VerifyCallback, ): Promise<any> { // Here, you can handle the validation and user creation logic. // The `profile` object will contain user information returned by Google. // You can use this information to find or create a user in your application's database. // The `done` callback should be called with the user object. // For example: // const user = await this.userService.findOrCreateUser(profile); // done(null, user); } }
Note: In this example, we’re using the ConfigService
from @nestjs/config
to retrieve the necessary configuration values from environment variables. Make sure you have the corresponding environment variables (GOOGLE_CLIENT_ID
, GOOGLE_CLIENT_SECRET
, and GOOGLE_CALLBACK_URL
) properly set.
3. Register the GoogleStrategy in your NestJS application. Open the app.module.ts
file and add the following lines:
import { Module } from '@nestjs/common'; import { PassportModule } from '@nestjs/passport'; import { GoogleStrategy } from './google.strategy'; @Module({ imports: [PassportModule], providers: [GoogleStrategy], }) export class AppModule {}
4. Configure the authentication routes in a dedicated authentication controller. For example, create a file named auth.controller.ts
with the following content:
import { Controller, Get, Req, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; @Controller('auth') export class AuthController { @Get('google') @UseGuards(AuthGuard('google')) googleLogin() { // This route will initiate the Google OAuth2 flow // and redirect the user to the Google login page. } @Get('google/callback') @UseGuards(AuthGuard('google')) googleCallback(@Req() req) { // This route is the callback URL registered with Google. // Passport
Leave a Reply