Valentin Macé
Valentin Macé

Reputation: 1262

Ionic + Passport isAuthenticated() returns false

I have my app in angularJs 1.6 built with MEAN stack working well, i'm using passport for authentication.

When I decide to test it with ionic, the app itself works well (files are basically identical) but the authentication with passport is broken

I can register and login a user, but when I want to check if the user is logged by using req.isAuthenticated() on my server, it always answers false.

I think it's because when I make a request from my normal angular app, the request contains a user object with password and email, but when I do from my ionic app, the user is missing

Difference between the two requests

I've spend the day working on it, any help would be great !

EDIT 1:

Sorry for not including code, it's my first experience here

My login route + my function for login

 app.post('/api/login', login);

function login(req, res, next) {
//console.log(req);
passport.authenticate('local-login', function(err, user, info) {
  if (err) {
    return next(err); // will generate a 500 error
  }
  // Generate a JSON response reflecting signup
  if (! user) {
    return res.send({success : 'false', message : req.flash('loginMessage') });
  }

  req.login(user, function(err) {
    if (err) { return next(err); }
      //console.log(req);
    return res.send({success : 'true', message : req.flash('loginMessage') });
  });

})(req, res, next);
}

The problem is, req.login is executed and I get a success: true, but with the ionic/cordova app, nothing seems to be memorized

After that, when I try to check if the user is logged with this

  app.get('/api/login/loggedin', function(req, res) {
    res.send(req.isAuthenticated() ? req.user : '0');
  });

I always get '0', I think it is because cordova/ionic app cannot use cookies (the difference between requests is also the lack of cookie from the ionic one), but I can't understand how to manage a solution that works both with my web angular app and it's ionic version (still with passport)

Upvotes: 0

Views: 479

Answers (1)

Valentin Macé
Valentin Macé

Reputation: 1262

Solution I just found:

In fact, it was a CORS problem because I don't know exactly why but Ionic/cordova didn't put {user:...} informations in the post request

Simply add

var cors = require('cors');
app.use(cors({origin: 'http://localhost:8100', credentials: true}));

to your server, it allows req to contains informations needed

and add

{withCredentials: true}

to all of your requests that are going to be checked with isAuthenticated(). For example:

$http.get('http://localhost:8081/api/todos', {withCredentials: true});

So the request sent contains the {user:...} part

I don't exactly know why you need to authorize it both in client and server side but it works fine

Upvotes: 0

Related Questions