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.
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème. J'ai été en utilisant la Stratégie Locale sur la page de connexion, puis vérifier si l'utilisateur était sur la session sur les autres demandes.
Comme vous le dites, la solution est d'utiliser de la SCRO pour l'ID de session pour être passé dans un cookie à l'aide de XMLHTTPRequest.
Au lieu d'utiliser de la SCRO qui ne fonctionne pas encore sur tous les browswers, je décidons d'utiliser des jetons d'accès sur les autres demandes. Le flux de travail que j'ai utilisé est comme suit:
OBTENIR /extrémité/abc123?access_token=abcdefg
Séances ne sont pas nécessaires dans l'Express.
J'espère que cette alternative permet de.
Avant de configurer quoi que ce soit dans l'express application, utilisez la commande suivante(exactement le même) pour définir l'en-tête de la réponse de la croix-domaine :