37 votes

Authentification de l'application côté client auprès de l'API REST à l'aide de CORS avec stratégie locale

Le Problème:

Servir sûr API côté client app en utilisant seulement un local, la stratégie d'authentification.
Les flèches rouges sont en partie les lacunes de la connaissance.

enter image description here

Contexte:

C'est - - - - client.example.com est de faire un POST pour api.example.com/login où la réussite client.example.com pouvez accéder à un OBTENIR un service comme api.example.com/secret.

Une idée!

Implémentation de l'authentification OAuth 2.0 hybrid type de subvention assis en face de l'API.

Pourquoi hybride?

  • Ce ne serait pas une Implicit Grant Flow aka Client-Side Web Applications Flow car il n'y a pas de redirection de l'API serveur trop grant jeton d'accès. (c) "Est-il ok pour soi-et-pour ainsi accéder à vos données?"

  • Il ne serait pas un Resource Owner Password Flow parce qu'un Client ID et la clé Secrète Client sont transmis en même temps que la demande de sorte qu'il est supposé l'application cliente est côté serveur.

OK... donc, qu'un peu des deux?

Que faire si nous avons utilisé un FSCC jeton sur la page de la charge de client-côté application, et la POSTE avec les informations d'identification utilisateur trop une authentification OAuth 2.0 extrémité d'échange de jeton d'accès? Vous authentifier à chaque demande ultérieure, avec le jeton d'accès et de la FSCC jeton après une connexion réussie.

Une bonne Node.js OAuth 2.0 de la bibliothèque, j'ai trouvé:

https://github.com/ammmir/node-oauth2-provider

Aidez-Moi!

Je ne peux pas trouver un exemple de travail d'une authentification de mesure qui permet de résoudre ce problème! Me pointer dans la bonne direction?

En fin de compte, le but ici est trop authentifier un client côté application d'une api REST à l'aide de la SCRO avec une stratégie locale --- c'est à dire nom d'utilisateur et mot de passe --- même si la convention ci-dessus n'est pas possible.

Pour Accueillir Générosité:

C'est un client côté application, nous allons donc rester tendance.

Je suis à la recherche d'un exemple de travail à l'aide de la Node.js OAuth 2.0 graines au-dessus de l'API/Auth server et un front end framework comme Angular.js ou Backbone.js pour faire des demandes.

L'exemple doit correspondre au contexte décrit ci-dessus.

3voto

jandersen Points 1618

Je suis en train de travailler sur une application avec une jolie architecture similaire si les services sont .NET Web API plutôt que de Nœud et nous utilisons DotNetOpenAuth pour OAuth au fournisseur. Plutôt que l'approche hybride vous êtes ce qui suggère que nous sommes en procédant de la manière suivante:

  1. x.com propose une page de connexion
  2. page de login de enregistre les informations d'identification de x.com
  3. côté serveur de la logique x.com combine client_id et client_secret avec les informations d'identification de soumettre une demande de jeton (ressources propriétaire de mot de passe des informations d'identification de la subvention que vous avez mentionné ci-dessus) à recevoir à la fois un accès temporaire jeton et un jeton d'actualisation
  4. le jeton d'actualisation est chiffré dans un cookie émis par x.com
  5. à la fois le cookie (avec chiffré actualiser jeton) et le temporaire jeton d'accès sont ensuite envoyés au navigateur
  6. l'application cliente (angulaire dans mon cas) peuvent désormais utiliser le jeton d'accès pour frapper api.x.com pour les services (Il semble que vous êtes bien conscients des limites de la SCRO... nous avons piraté une version angulaire de $de ressources pour faciliter cela, mais ce n'était pas assez, puisque nous avons voulu utiliser tous les verbes HTTP soutien et IE9)
  7. lorsque le jeton d'accès expire, côté client, l'application peut demander un nouveau jeton d'accès x.com
  8. côté serveur, x.com déchiffre le cookie à l'actualisation de jeton et un autre oauth appel pour un nouveau jeton d'accès

C'est assez haut niveau mais j'espère que vous aurez une bonne idée sur la façon d'appréhender votre situation. Dans mon cas, et il semble que dans le vôtre, nous ne voulions pas utiliser l'état de session ou d'une base de données pour stocker le jeton d'actualisation, mais évidemment exposer que le navigateur introduit des préoccupations de sécurité de sorte que le chiffrement de l'actualisation jeton est important (entre autres considérations relatives à la sécurité) et l'utilisation du cookie élimine la nécessité pour l'état de session ou autre stockage persistant sur x.com.

2voto

Pablo De Nadai Points 897

J'ai construit cet exemple en utilisant Node et PassportJS pour montrer comment authentifier les utilisateurs avec Facebook ou une stratégie locale. Comme vous l'avez décrit, les deux côtés appartiennent à des domaines différents. CORS doit être activé.

GitHub: https://github.com/pablodenadai/Corsnection
Démo en direct: http://corsnection-client.herokuapp.com/

1voto

unludo Points 1673

Pas de réponse en cours d'exécution pour le prix. Juste mes 2 cents :)

Sur mon serveur web,

Je fais de mon authentification par le biais d'un appel reste avec login/mot de passe par l'authentification de base sur le protocole https. Cet appel offre une clé pour le client (une page web app).

Ensuite, tous les RESTE d'appel est signé avec la clé. Le serveur vérifie que la signature est correcte et tout encore se passer en https.

Ce mécanisme est très utilisé, je crois.

Je ne vois pas le problème avec la croix de domaine. J'ai une seule source d'anf si j'ai besoin de quelque chose à partir d'une autre source, je ne l'utiliserais JSONP.

J'utilise nginx https->http transitaire.

Pas sûr de savoir comment il est en concurrence avec un OAuth2 solution.

0voto

Milan Jaric Points 3039

Je ne peux pas promettre que j'ai le temps d'écrire de travail exemple mais je peux vous montrer 2 chemins :)

La plus grande affaire est de la SCRO. Après vous résoudre ce problème, il est facile à utiliser $http service. Donc, première et probablement la plus facile peut-être configurer un proxy inverse dans x.com serveur web qui pointe vers api.x.com. J'ai écrit l'article ici

La deuxième approche est la meilleure, et créé pour exactement cet effet, d'autoriser domaine spécifique pour l'utilisation de vos ressources. Elle implique un peu de codage api.x.com si vous n'avez pas à changer quoi que ce soit dans les nouvelles applications web servi dans d'autres domaines. Vous avez simplement besoin d'autoriser la SCRO demandes api.x.com service.

  • Créer une table dans la base de données où vous pouvez gérer la liste des domaines autorisés
  • Ajouter à ça que l'enregistrement de la table "x.com"
  • dans api.x.com ajouter un filtre de requête/intercepteur ce que jamais terme technique que vous utilisez pour la méthode qui doit être appelée après la demande est traitée et d'ajouter, en réponse Access-Control-Allow-Origin: x.com si la demande vient de l'x.com (en d'autres termes vérifier en-tête de la requête se référer valeur correspondre à n'importe quelle valeur dans le tableau ci-dessus et mettre une valeur dans Access-Control-Allow-Origin-tête de réponse).

C'est tout :) Après cela, si vous savez comment l'utiliser $http ou jQuey.ajax , vous serez en mesure de POST/PUT/DELETE/... toute demande d'api.x.com de toute autorisé de domaine en quelques minutes.

0voto

Kyaw Tun Points 3878

J'ai très similaire idée à l'aide de vinilla js web app et de la croix d'authentification de domaine en FGA en backend, ou OpenID connect.

L'application web est exécuté sur le CDN. Lorsque cliquez sur lien de connexion, il va respectifs de serveur de connexion et de redirection vers l'application web (avec XSRF jeton de sécurité et HTTPS uniquement cookie). Serveur de connexion accepter la croix de domaine demande avec les informations d'identification. XSRF jeton doit être définie (en-tête) avec chaque demande. cookie est défini par le navigateur. Puisque c'est uniquement HTTP cookie, JS ne peut pas le lire. La technique est très sécurisé.

Une fois la connexion, vous pouvez obtenir sécurisé évaluer à partir du serveur de connexion.

Pour une description détaillée, vous pouvez le trouver ici et open source repo ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X