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

LinkList implementation with Insert, InsertAt, Delete Methods in Java

Linklist Representation  Node.java   public class Node { int data ; Node next ; Node( int data , Node next ){ this . data = data ; this . next = next ; } } LinkList.java public class LinkList { Node head ; public void insert( int data ) { Node node = new Node( data , null ); if ( head == null ) { head = node ; } else { Node currentNode = head ; while ( currentNode . next != null ) { currentNode = currentNode . next ; } currentNode . next = node ; } } public void inserAtStart( int data ) { Node node = new Node( data , null ); node . next = head ; head = node ; } public void insertAt( int index , int data ) { Node node = new Node( data , null ); // if index is 0 or head is null then insert at start if ( index == 0 || head == null ) { inserAtStart( data ); } els

Python Language Basics - 2

Slice string in python: details= "Akshay Kumar Gupta--akshaygupta.me" # details[:6] and details[0:6] will give same result print(details[: 6 ]) # OUTPUT: Akshay # details[20:] and details[20:34] will give same result print(details[ 20 :]) # OUTPUT: akshaygupta.me # -1 denotes the reverse order print(details[ 11 ::- 1 ]) #OUTPUT: ramuK yahskA # Here -9 denotes the count from the end of the string print(details[:- 9 :- 1 ]) #OUTPUT: em.atpug #Both syntax gives the same result for reversing the string print(details[- 1 ::- 1 ]) #OUTPUT: em.atpugyahska--atpuG ramuK yahskA print(details[::- 1 ]) #OUTPUT: em.atpugyahska--atpuG ramuK yahskA Format print in python: print( "hi, My name is {} and I am a {}. I like {}." .format( "Akshay" , "Software Engineer" , "python" )) In the above print statement, "{}" refers to the placement of the values given in "format()" function. First value in the order "format()"

Print Given Number Pattern in Java

public class NumberPattern { public static void main(String a []) { for ( int i = 1; i <=4; i ++) { for ( int j =0; j <4; j ++) { int sum = i + j ; // if sum is greater than 4 then subtract 4 from the sum otherwise print the sum System. out .print( sum > 4 ? sum - 4+ " " : sum + " " ); } System. out .println(); } } }