Emad Emami
Emad Emami

Reputation: 6629

passport js with GET method

I'm trying to confirm users email addresses by sending an activator code to their email address. when user clicked on activator URL (GET method), server will compare activator code + username and try to handle it.

I'm using GET method like this:

router.get('/activator/:username/:activator', function(req, res, next){
        passport.authenticate('activator', function(err, user, info){
            if (err) {console.log('Error info: ', info);}
            else if (!user) {console.log('User not found: ' , info)}
            else {console.log('User activated')}
            res.redirect('/');
        })(req, res, next)
 });

And activator.js is:

var LocalStrategy   = require('passport-local').Strategy;
var User = require('../models/user');

module.exports = function(passport){

    passport.use('activator', new LocalStrategy({
            usernameField: 'username',
            passwordField: 'activator'
        },
        function(username, password, done) { 
            User.findOne({username: username , activator: password},
                function(err, user){
                    if (err){
                        return done(null, false, 'User not found.');
                    }
                    user.activate = true;
                    user.save(function (err) {
                        if (err) return handleError(err);
                        return done(null, user, 'Persistence Registration successful');
                    });
                });
        })
    );
};

But server response is: { message: 'Missing credentials'} It seems passport js and GET method params has some conflicts.

Am i right? what should i do for that?

Upvotes: 0

Views: 1020

Answers (2)

Emad Emami
Emad Emami

Reputation: 6629

Problem solved!

As I said, problem was for GET method & passport connection. passport function only read from req.query which is only on POST method but GET method is using req.params.

So I changed my application code to :

router.get('/activator/:username/:activator', function(req, res, next){
        req.query = req.params; // GET to POST simulator!
        passport.authenticate('activator', function(err, user, info){
            if (err) {console.log('Error info: ', info);}
            else if (!user) {console.log('User not found: ' , info)}
            else {console.log('User activated')}
            res.redirect('/');
        })(req, res, next)
 });

Upvotes: 1

abdulbari
abdulbari

Reputation: 6242

your Strategy fields are not valid, replace it with email and password and send same parameters from client side

module.exports = function(passport) {

  passport.use('activator', new LocalStrategy({
      usernameField: 'email',
      passwordField: 'password',
    },
    function(username, password, done) {
      User.findOne({
          username: username,
          activator: password
        },
        function(err, user) {
          if (err) {
            return done(null, false, 'User not found.');
          }
          user.activate = true;
          user.save(function(err) {
            if (err) return handleError(err);
            return done(null, user, 'Persistence Registration successful');
          });
        });
    }));
};

Upvotes: 0

Related Questions