Question Comment utiliser la connexion Passport-Facebook sans redirection?


Je construis une application phonegap qui aura nodejs du côté serveur. Je voulais implémenter la connexion en utilisant la stratégie passport-facebook, mais leurs rappels spécifient deux routes, / successcallback et / failurecallback. Avec une application à une seule page, cela rend très déroutant le fait que les utilisateurs soient redirigés vers telle ou telle page.

Je ne veux pas servir de fichiers statiques (index.html, login.html) à partir du serveur, mais plutôt les placer sur le client et demander au client de faire des appels ajax. Jusqu'à présent, je suis en mesure de faire un appel / auth / facebook en tant que requête AJAX, mais je ne peux pas recevoir de réponse sur la même demande car la stratégie de connexion nécessite que l'utilisateur soit redirigé. Je préférerais envoyer un identifiant ou un nom d'utilisateur à l'utilisateur lors d'une connexion réussie ou lui indiquer le formulaire de connexion (qui figure également dans le répertoire www de phonegap) en cas d'échec. Mais la redirection et les erreurs CORS m'empêchent de le faire. Y a-t-il un moyen de le mettre en œuvre? Je l'ai cherché depuis quelques semaines maintenant, mais sans succès. J'apprécierais vraiment votre aide!

PS: je préférerais ne pas avoir à envoyer tout le contenu HTML et statique du serveur de noeud.

EDIT: Ajouter un code de connexion pour mieux comprendre:

app.get('/userpage', utility.isLoggedIn, function(req, res)
{
    res.send('User:'+req.user);
});

app.get('/', utility.isLoggedIn, function(req, res)
{
    res.redirect('/userpage');
});

app.get('/auth/facebook', passport.authenticate('facebook'));

app.get('/auth/facebook/callback',passport.authenticate('facebook',
{
    successRedirect : '/',
    failureRedirect : '/login'
}));

app.get('/logout', function(req, res)
{
    req.logout();
    res.redirect('/login');
});


utility.isLoggedIn:
function isLoggedIn(req, res, next)
{
    if (req.isAuthenticated())
    return next();

    res.redirect('/login');
}

10
2017-07-06 12:30


origine


Réponses:


Au lieu d'utiliser les redirections standard offertes par passeport, vous pouvez définir votre propre fonction qui sera exécutée au lieu de la redirection. Voici un exemple de ce à quoi ce code ressemblerait

 passport.authenticate('login', function(err, user, info) {
      if (err) { return next(err); }
      if (!user) { return res.json({ status:"failed", "error": "Invalid credentials" }); }

// req / res held in closure
      req.logIn(user, function(err) {
          if (err) { return next(err); }

          return res.json({ "status":"success"});
      })
 })(req, res, next);

0
2017-12-12 08:30



Vous ne pouvez pas faire cela avec facebook oAuth, mais Facebook fournit une autre solution de connexion où vous pouvez coder votre application client pour demander un jeton, que vous pourrez ensuite valider sur le serveur avec passeport-facebook-jeton.

De cette façon, vous pouvez utiliser les avantages du passeport pour les sessions persistantes, sans cette redirection ennuyeuse.


0
2018-05-09 21:45