138 votes

Sécuriser mon API REST avec OAuth tout en permettant l’authentification via des tiers fournisseurs de OAuth (à l’aide de DotNetOpenAuth)

J'ai un produit avec une simple API REST de sorte que les utilisateurs du produit peut intégrer directement les caractéristiques du produit sans l'aide de mon interface utilisateur web.

Récemment, j'ai été faire de l'intérêt de tiers divers sur l'intégration de leurs clients de bureau avec l'API pour permettre aux utilisateurs de mon produit pour accéder à leurs données à l'aide de cette application tierce.

J'ai vu que les applications qui veulent utiliser Twitter s'authentifier à l'aide d'une page de connexion hébergé par Twitter qui accorde une application spécifique de l'autorisation d'accès de l'utilisateur des données. Vous cliquez sur "Autoriser" ou "Refuser" et le processus d'authentification est terminée. Facebook utilise le même mécanisme que mieux que je peux dire.

Sur d'autres recherches, ce qui semble être OAuth dans l'action, et vu que mon API .Net-base, je pense que je devrais utiliser DotNetOpenAuth et de fournir un mécanisme similaire. Malheureusement, les échantillons sont peu documentés (si) et le seul tutoriels que je peux trouver en ligne semble être concentré sur vous aider à fournir un mécanisme de connexion de vos utilisateurs pour qu'ils puissent se connecter à votre site web à l'aide d'un fournisseur tiers.

Ce que je voudrais vraiment comme faire est de demander mon RESTE de l'API de gérer l'ensemble de la base de l'authentification et de la logique métier pour mon application web et ont, sous le capot, mon application web essentiellement être une autre application qui utilise l'API via OAuth. Utilisateurs de s'authentifier sur le site, soit directement à l'aide de leur nom d'utilisateur et le mot de passe, ou par l'intermédiaire d'un fournisseur tiers, tels que MyOpenID ou Facebook et ensuite, le site serait en quelque sorte utiliser le retour de jeton pour s'authentifier auprès de l'API REST.

Architectural Diagram

Il ressemble fondamentalement j'ai besoin de mon API pour en quelque sorte l'hôte d'un service OAuth, mais également aux utilisateurs d'utiliser un tiers service OAuth. Je ne peux pas aider mais je pense que je n'arrive pas à avoir assez de connaissance sur le protocole OAuth pour décider si je suis de compliquer à l'excès des choses ou si ce que je suis en train de faire est une bonne ou une mauvaise façon de faire les choses.

Quelqu'un peut-il me donner au moins un aperçu général des étapes que j'ai besoin d'entreprendre, ou de ce que je devrais regarder pour ce faire? Ou me pointer à certains tutoriels? Ou blast ma proposition et me dire que je vais sur ce sujet (l'architecture) tout faux?

123voto

Andrew Arnott Points 35346

Tout d'abord je voudrais souligner la différence entre l'authentification et l'autorisation:

Un utilisateur s'authentifie sur votre site web en fournissant certaines informations d'identification telles que le nom d'utilisateur+mot de passe. OpenID permet d'être déplacé par l'utilisateur de s'authentifier à un autre service, qui affirme ensuite l'identité de l'utilisateur de votre site web sur le compte de l'utilisateur. Votre site approuve le service de tiers (le Fournisseur OpenID), et considère donc la connexion de l'utilisateur.

Un service ou de l'application ne permet pas de s'authentifier sur votre site web, du moins pas de manière générale. L'utilisateur autorise un service ou d'une application d'accéder aux données de l'utilisateur. Cette opération est généralement effectuée par l'application demande l'autorisation du prestataire de services, puis de l'envoyer à l'utilisateur au fournisseur de service, où l'utilisateur s'authentifie (de sorte que le fournisseur de service sait qui est son parler) et puis, l'utilisateur dit le site "oui, c'est ok pour [application] pour accéder à mes données [dans certaines limitée]". À partir de là, l'application utilise un jeton d'autorisation pour accéder aux données de l'utilisateur sur le site du fournisseur d'accès. Notez que l'application n'a pas à s'authentifier lui-même comme si c'était de l'utilisateur, mais il utilise un autre code pour assurer le service qu'il est autorisé à avoir accès à des données de l'utilisateur.

Donc, avec cette distinction a précisé, vous pouvez prendre des décisions sur votre site à propos de l'authentification et de l'autorisation de manière totalement indépendante. Par exemple, si vous souhaitez que vos utilisateurs puissent se connecter avec tous: nom d'utilisateur+mot de passe, OpenID, et Facebook, vous pouvez le faire. Complètement orthogonale de la décision est de savoir comment vous autorisez les applications (il existe de nombreux protocoles que vous pouvez utiliser pour cela, OAuth, bien sûr, être très populaire).

OpenID est axé sur l'utilisateur de l'authentification. OAuth est axé sur la demande d'autorisation. Cependant, quelques-uns des services tels que Facebook et Twitter ont choisi d'utiliser OAuth pour l'authentification et l'autorisation au lieu de l'utiliser pour l'authentification OpenID et OAuth pour l'autorisation.

Maintenant, pour votre propre projet, je vous recommande fortement de consulter la ASP.NET MVC 2 OpenID site web (C#) modèle de projet disponible à partir du VS Galerie. Hors de la boîte, il est livré avec l'authentification OpenID et OAuth Fournisseur de Services de soutien. Cela signifie que les utilisateurs peuvent se connecter avec OpenID, et 3ème partie, les applications et les services peuvent utiliser OAuth pour faire des appels API pour votre site web et accéder à des données utilisateur.

Ce qu'il sonne comme vous souhaitez les ajouter à ce modèle de projet une fois que vous obtenez, c'est la possibilité pour vos utilisateurs de se connecter avec un nom d'utilisateur+mot de passe ainsi que OpenID. Aussi, si vous voulez Facebook et Twitter pour être une option pour vos utilisateurs, vous devez la mettre, car ils n'utilisent pas le standard OpenID. Mais le DotNetOpenAuth téléchargement inclut des échantillons pour la connexion avec Twitter et Facebook si vous avez quelques conseils.

Je soupçonne que vous n'aurez pas beaucoup, sinon rien à faire sur l'autorisation avant. Il est livré avec OAuth comme je l'ai dit avant, et qui sera probablement suffisant pour vous.

11voto

Jon Nylander Points 4113

Tout d'abord. Vous devez mentalement séparer ce qui est de votre API - à partir de méthodes d'authentification.

Votre API est fondamentalement ressources, et des méthodes pour manipuler ces ressources. Et vous pouvez avoir plusieurs méthodes d'authentification d'accès de l'API.

OAuth est un tel mécanisme d'authentification. Étant OAuth fournisseur est grande, même si la spécification est un peu difficile à saisir, en particulier les parties qui ont à faire avec les signatures. Une fois que vous avez OAuth en place, les demandes de clients ont généralement un temps facile de l'authentification, il y a tellement de "l'open source, déjà fait, juste de mettre en oeuvre" les bibliothèques disponibles dans la plupart des langues.

Les avantages et les inconvénients de ce Protocole ont été débattues pendant un certain temps. Mais pour former votre propre opinion, je suggère la lecture de ce guide de référence, écrit par Eran Marteau-Lahav, l'une des personnes responsables de l'OAuth spécification.

La seule alternative réelle à OAuth aussi loin que je le vois, sont OAuth 2.0 et simplement l'authentification de base.

Autres que que, vous parlez d'authentification à l'aide de Open-ID, ou facebook identité etc. C'est encore une autre question que vous devez vous poser. Mais c'est vraiment en dehors de la portée de l'Api et OAuth. Pour moi, ça fait plus d'une question de la création d'un utilisateur dans votre service. J'ai peut-être tort.

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