Passport Google Strategy Redirect 500 status code

Viewed 97

I've been working on a google authentication using passport and postgres and the redirect URI returns an error(status code 500). I think the function done is the problem, but I don't exactly know what is wrong. I tried placing logs. The serializeUser function doesn't fire, I tried logging.

Here is my passport setup

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20');
const GithubStrategy = require('passport-github2');
const localStrategy = require('passport-local');
//const bcrypt = require('bcrypt');
const db = require('./db/db');

passport.serializeUser((user, done) => {
    console.log('here?);
    done(new Error('Serialize problem'), user.id); //first arg is the error
})
passport.deserializeUser((id, done) => {
    db.query(
        'SELECT id FROM "Users" WHERE id=$1', [id],
        (error, results) => {
            if (error) {
                throw new Error('Problemo numero 1')
            }
            console.log(results.rows[0])
            done(new Error('Problemo'), results.rows[0]); //first arg is the error




        })
});

passport.use(new GoogleStrategy({
    //options for the strategy
    callbackURL: 'http://localhost:9000/auth/google/redirect',
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET

}, (accesToken, refreshToken, profile, done) => {
    //passport callback function
    console.log('passport callback function fired')
    console.log(profile)
    db.query(
        `SELECT * FROM "Users" WHERE id=${profile.id}`,
        (error, results) => {

            if (results.rows.length === 0) {
                const date = new Date();
                const password = Math.floor(Math.random() * 100000);
                
                db.query(
                    'INSERT INTO "Users" (id, username, password, creation_date) VALUES ($1, $2, $3, $4)', [profile.id, profile.displayName, 0, date],
                    (error, results) => {
                        if (error) {
                            throw new Error('Insert error')
                        }
                    }


                )
                done(new Error('select error'), profile.id)
            } else {
                console.log(`Current user is id=${profile.id}`)
                done(new Error('select error 2'), profile.id)
                console.log('works?')
            }

        }
    )
}));

And express setup

var createError = require('http-errors');
var express = require('express');
const passport = require('passport');
var path = require('path');
var cookieParser = require('cookie-parser');
var cookieSession = require('cookie-session');
var logger = require('morgan');
var cors = require('cors');
let mailRouter = require('./mail');
let bcrypt = require('bcrypt');
const db = require('./config/db/db');
const bodyParser = require('body-parser');
require('dotenv').config();

const passportSetup = require('./config/passport');
const authRouter = require('./routes/auth-routes');


var app = express();

let users = [];

app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

//create cookie and encrypt it
app.use(cookieSession({
    maxAge: 24 * 60 * 60 * 1000,
    keys: [process.env.COOKIE_KEY]
}))

//initialize passport
app.use(passport.initialize());
app.use(passport.session())

app.use(function(req, res, next) {
    next(createError(404));
});


// error handler

app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.send('error');
});




var port = process.env.PORT || '9000';
app.listen(port);

And here is my db.js file

const { Pool } = require('pg')
const { Client } = require('pg')

const pool = new Pool({
    user,
    host,
    database,
    password,
    port
})


/*
const client = new Client()
client.connect()
*/

module.exports = {
    query: (text, params, callback) => {
        const start = Date.now()
        return pool.query(text, params, (err, res) => {
            const duration = Date.now() - start
            console.log('executed query', { text, duration, /*rows: res.rowCount*/ })
            callback(err, res)
        })
    },
}
1 Answers

The issue is that you are passing a newly constructed error to the done function within the verify callback. You only need to pass an error in the first argument if something went wrong. Otherwise it should be passed null.

Here is a brief example of how done could be used:

db.query(
    'INSERT INTO "Users" (id, username, password, creation_date) VALUES ($1, $2, $3, $4)', [profile.id, profile.displayName, 0, date],
    (error, results) => {
        if (error) {
            // pass error through done function
            done(error)
        }
        // Pass profile object to be serialized
        done(null, profile)
    }
)

Reference for the done function: http://www.passportjs.org/docs/configure/#verify-callback

Related