Skip to main content

Passport Package for Authentication in NodeJS

I watched a video and learnt about the passport package to handle the authentication and save the user data in MongoDB from Google.

Passport is the middleware for NodeJS. It can be used to authenticate using a username and password, Facebook, Twitter, Google and more. It is simple to use and flexible.

Steps to use passport package for google authentication:-
  1. install passport npm i passport passport-google-oauth20 --save
  2. I used the below code to handle the authentication. 
1. This file has Google strategy to fetch the user's profile from user's Google profile and saving it in my MongoDB.
passport.js
const GoogleStrategy = require('passport-google-oauth20');
const User = require('../models/User');

module.exports = function (passport) {
passport.use(new GoogleStrategy({
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: '/auth/google/callback'
},
async (accessToken, refreshToken, profile, done) => {
console.log(profile);
const newUser = {
googleId: profile.id,
firstName: profile.name.givenName,
lastName: profile.name.familyName,
displayName: profile.displayName,
image: profile.photos[0].value
}
try {
let user = await User.findOne({
googleId: profile.id
});
if (!user) {
user = await User.create(newUser);
}
done(null, user);
} catch (err) {
console.error(err);
}
}));
passport.serializeUser((user, done) => {
done(null, user.id)
});

passport.deserializeUser((id, done) => {
User.findById(id, (err, user) => done(err, user));
});
}

Google client id and client secret can be obtain from Goole Cloud Console by creating a new project.

2. I used MongoDB to save the user details using mongoose package.

User.js
const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
googleId: {
type: String,
required: true
},
displayName: {
type: String,
required: true
},
firstName: {
type: String,
required: true
},
image: {
type: String
},
createdAt: {
type: Date,
default: Date.now()
}
});

module.exports = mongoose.model('User', UserSchema);

3. I created a route file to handle the authentication.
auth.js
const express = require('express');
const passport = require('passport');
const router = express.Router();
const User = require('../models/User');

//@route GET /auth/google
router.get('/google', passport.authenticate('google', {
scope: ['profile']
}));

//@route GET /auth/google/callback
router.get('/google/callback', passport.authenticate('google', {
failureRedirect: '/'
}), (req, res) => {
res.render('dashboard', {
layout: 'main'
});
});

module.exports = router;

4. I initialized the passport in app.js file
const path = require('path');
const express = require('express');
const dotenv = require('dotenv');
const exphbs = require('express-handlebars');
const passport = require('passport');
const connectDB = require('./config/db');
//dotenv config
dotenv.config({
path: './config/config.env'
});

//Passport config
require('./config/passport')(passport);

connectDB();
const app = express();

//Handlebars
app.engine('.hbs', exphbs({
defaultLayout: 'main',
extname: '.hbs'
}));
app.set('view engine', 'hbs');

//Passport middleware
app.use(passport.initialize());

//Static folder
app.use(express.static(path.join(__dirname, 'public')));

//Routes
app.use('/', require('./routes/index'));
app.use('/auth', require('./routes/auth'));
const PORT = process.env.PORT || 3000;
app.listen(PORT, console.log(`Server running on ${process.env.NODE_ENV} mode on ${PORT}`));



Note: I'll upload the above project on Github very soon.

Comments

Popular posts from this blog

How to kill a process running on particular port in Linux

  If port 8080 needs to be kill use below single command: kill -9 $(lsof -t -i:8080) Note: remove -9 from the command, if you don't want to kill the process violently. To list any process listening to the port 8080: lsof -i:8080 Use any port number that you want to kill.

How to Setup Virtual Environment in Python with venv

A virtual environment is the most used tool by the developers to isolate the dependencies for different projects. Suppose you have two projects say porj1 and proj2 . proj1 needs the Django dependency with version 3.2 but your proj2 needs the Django dependency with version 2.2. In this situation you need a virtual environment to keep the both version on your system separately.  How to create virtual environment in python:  Decide a directory where you want to create the virtual environment. You can use your project directory or any other directory as per your wish.  Run the below command. Here` awesome_proj_env ` is the folder where virtual environment will be created. if the folder does not exists then it will be created automatically. python3 -m venv awesome_proj_env    Activate the virtual environment: On Linux/Mac OSX: source awesome_proj_env/bin/activate  On Windows: awesome_proj_env \Scripts\activate.bat Deactivate the virtual environment in Pyth...

[Resolved] MySQL error code: 1175 during UPDATE in MySQL Workbench

 If WHERE clause does not have primary key in UPDATE query then this error comes. If you want to run the update query without having primary key in WHERE clause of UPDATE query then below command needs to be run to disable the safe mode. SET SQL_SAFE_UPDATES = 0; It is good to run  SET SQL_SAFE_UPDATES = 1;   after running your UPDATE query and again enable the safe mode. Example: SET SQL_SAFE_UPDATES=0; UPDATE table_name SET col_name=1; SET SQL_SAFE_UPDATES=1;