Un API oauth avec passport.js et express.js (node.js)

J'ai je pense un problème spécifique, à moins que je ne fais pas les choses dans le droit chemin.

J'ai une application avec 2 côtés, un client (site en html), et une API (construit avec express + mongodb). L'API devra être accessible de manière sécurisée. Ils sont tous les deux dans des domaines différents, pour l'instant, disons que mon site est sur domain.com et mon API est sur l'api.com:3000.

J'ai ajouté passeport pour obtenir un jeton d'accès à partir de Github que je crée mes utilisateurs avec leurs données, afin que je puisse avoir un "Signe avec Github" fondamentalement.

Mon processus actuel est:

1) le client (le site), ouvre une fenêtre sur l'API

window.open("http://api.com:3000/oauth")

2) L'express server, démarrez le processus de délivrance des passeports:

app.get('/oauth', passport.authenticate('github'), function(req, res) {

});

Pour la stratégie, j'ai utilisé ce code.

3) je redirige le rappel à une url qui ferme la popup (javascript avec une fenêtre.close()):

app.get('/oauth/callback', passport.authenticate('github', { failureRedirect: '/' }), function(req, res) {
    res.redirect('/auth_close');
});

À ce stade, tout est beau, je suis maintenant connecté à l'API. Mon problème est de savoir comment récupérer des données sur le client, que le client ne sait rien encore sur accessToken, d'un utilisateur ou id d'utilisateur.

Donc, de la part du client (le site qui ouvre la popup), j'ai essayé différentes approches:

  • obtenir une valeur de la popup: ne fonctionne pas à cause de la redirection, j'en perds la trace de la popup javascript information

  • l'appel de mon API pour obtenir la "utilisateur actuel" dans la session, comme http://api.com:3000/current
    Demande d'une plus, pas l'idéal, mais ce travail. Cependant, j'ai encore un problème.

Ce /url actuelle est de retour à l'utilisateur si j'y accéder depuis le navigateur, parce que le navigateur à envoyer dans l'en-tête de demande expresse du cookie de session:

Cookie:connect.sid=s%3AmDrM5MRA34UuNZqiL%2BV7TMv6.Paw6O%2BtnxQRo0vYNKrher026CIAnNsHn4OJdptb8KqE

Le problème est que j'ai besoin de faire cette demande à partir de jquery ou similaire, et c'est là où il échoue parce que la session n'est pas envoyé. De sorte que l'utilisateur n'est pas retourné:

app.get('/current', function() {
    //PROBLEM HERE, req.user is undefined with ajax calls because of the session!
});

J'ai trouvé une façon de le faire fonctionner mais je ne suis pas heureux parce que je vais avoir de la croix-navigateurs de la SCRO problèmes, il est l'ajout d'exprimer:

res.header("Access-Control-Allow-Credentials", "true");

Et ajouter le withCredentials champ dans un appel ajax jquery, comme expliqué ici.

Une carte de fieldName-fieldValue de définir des paires sur le natif de l'objet XHR. Par exemple, vous pouvez l'utiliser pour définir des withCredentials à vrai pour les requêtes inter-domaine si nécessaire.

$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});

Je ne suis pas aussi heureux avec ce que je vais perdre le caractère générique sur ma tête: Access-Control-Allow-Origin, j'ai besoin de spécifier un domaine, comme l'explique ici.

Donc, je ne suis pas sûr que l'approche que je devrais prendre, ici, la seule chose dont j'ai besoin est que le client se soit un accessToken, ou un identifiant de retour du passeport oauth processus. L'idée est d'utiliser ce jeton dans chaque appel à l'API pour valider les appels.

La moindre idée?

  • Avez-vous trouvé quelque chose? Je suis avec le même problème 🙁
  • Vous pouvez voir mon this réponse concernant le même sujet. Il fonctionne pour moi.
InformationsquelleAutor Soundstep | 2012-12-18