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

138

J'ai un produit avec une API REST simple afin que les utilisateurs du produit puissent s'intégrer directement aux fonctionnalités du produit sans utiliser mon interface utilisateur Web.

Récemment, divers tiers m'intéressent à intégrer leurs clients de bureau à l'API pour permettre aux utilisateurs de mon produit d'accéder à leurs données à l'aide de cette application tierce.

J'ai vu que les applications qui souhaitent utiliser Twitter s'authentifient à l'aide d'une page de connexion hébergée par Twitter qui accorde à une application spécifique l'autorisation d'accéder aux données de cet utilisateur. Vous cliquez sur le bouton "Autoriser" ou "Refuser" et le processus d'authentification est terminé. Facebook utilise le même mécanisme que je sache.

Après des recherches plus poussées, cela semble être OAuth en action, et vu que mon API est basée sur .Net, je pense que je devrais utiliser DotNetOpenAuth et fournir un mécanisme similaire. Malheureusement, les exemples sont peu documentés (voire pas du tout) et les seuls didacticiels que je peux trouver en ligne semblent être axés sur vous aider à fournir un mécanisme de connexion à vos utilisateurs afin qu'ils puissent se connecter à votre site Web en utilisant un fournisseur tiers.

Ce que j'aimerais vraiment faire, c'est que mon API REST gère toute l'authentification de base et la logique métier de mon application Web et que, sous le capot, mon application Web soit essentiellement une autre application qui utilise simplement l'API via OAuth. Les utilisateurs s'authentifieraient sur le site Web soit directement en utilisant leur nom d'utilisateur et leur mot de passe, soit via un fournisseur tiers tel que MyOpenID ou Facebook, puis le site Web utiliserait en quelque sorte le jeton retourné pour s'authentifier auprès de l'API REST.

Schéma architectural

Il semble que j'ai besoin de mon API pour héberger en quelque sorte un service OAuth, mais que les utilisateurs utilisent également un service OAuth tiers. Je ne peux pas m'empêcher de penser que je n'ai pas assez de connaissances sur OAuth pour décider si je complique trop les choses ou si ce que j'essaie 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 je dois entreprendre ou de ce que je devrais examiner pour y parvenir? Ou dirigez-moi vers des tutoriels? Ou faire exploser ma proposition et me dire que je vais tout à fait à propos de cela (architecturalement)?

Nathan Ridley
la source
Bonjour Nathan, je suis aux prises avec un scénario similaire à celui que vous décrivez ici et je me demandais si vous aviez quelque chose à ajouter à ma question ou à mes conseils sur la façon de contourner mon manque de compréhension actuel sur l'intégration OpenID avec mon API stackoverflow.com/ questions / 16855131 /…
Jammer

Réponses:

123

Je voudrais tout d'abord souligner la différence entre authentification et autorisation:

Un utilisateur s'authentifie sur votre site Web en fournissant des informations d'identification telles qu'un nom d'utilisateur + un mot de passe. OpenID permet à cela d'être déplacé en demandant à l'utilisateur de s'authentifier auprès d'un autre service, qui affirme ensuite l'identité de l'utilisateur sur votre site Web au nom de l'utilisateur. Votre site fait confiance au service tiers (le fournisseur OpenID) et considère donc l'utilisateur connecté.

Un service ou une application ne s'authentifie pas sur votre site Web - du moins pas généralement. Un utilisateur autorise un service ou une application à accéder aux données de l'utilisateur. Cela se fait généralement par l'application demandant l'autorisation du fournisseur de services, puis en envoyant l'utilisateur au fournisseur de services, où l'utilisateur s'authentifie d'abord (afin que le fournisseur de services sache à qui il parle), puis l'utilisateur dit au site "oui, il est permis à [l'application] d'accéder à mes données [d'une manière restreinte] ». Dès lors, l'application utilise un jeton d'autorisationpour accéder aux données utilisateur sur le site du fournisseur de services. Notez que l'application ne s'authentifie pas comme s'il s'agissait de l'utilisateur, mais qu'elle utilise un autre code pour garantir au service qu'elle est autorisée à accéder aux données d'un utilisateur particulier.

Donc, avec cette distinction clarifiée, vous pouvez prendre des décisions sur votre site concernant l'authentification et l'autorisation en toute indépendance. Par exemple, si vous souhaitez que vos utilisateurs puissent se connecter avec tous les éléments suivants: nom d'utilisateur + mot de passe, OpenID et Facebook, vous pouvez le faire. Une décision complètement orthogonale est la façon dont vous autorisez les applications (il existe de nombreux protocoles que vous pouvez utiliser pour cela, OAuth étant bien sûr très populaire).

OpenID se concentre sur l' authentification des utilisateurs . OAuth se concentre sur l' autorisation des applications . Cependant, quelques services tels que Facebook et Twitter ont choisi d'utiliser OAuth pour l'authentification et l' autorisation au lieu d'utiliser OpenID pour l'authentification et OAuth pour l'autorisation.

Maintenant, pour votre propre projet, je vous recommande fortement de consulter le modèle de projet de site Web (C #) OpenID ASP.NET MVC 2 disponible dans VS Gallery. Prêt à l'emploi, il est livré avec l'authentification OpenID et la prise en charge du fournisseur de services OAuth. Cela signifie que vos utilisateurs peuvent se connecter avec OpenID et que les applications et services tiers peuvent utiliser OAuth pour passer des appels API vers votre site Web et accéder aux données utilisateur.

Ce qu'il semble que vous souhaitiez ajouter à ce modèle de projet une fois que vous avez commencé, c'est la possibilité pour vos utilisateurs de se connecter avec un nom d'utilisateur + un mot de passe ainsi qu'avec OpenID. De plus, si vous souhaitez que Facebook et Twitter soient une option pour vos utilisateurs, vous devez également l'implémenter car ils n'utilisent pas la norme OpenID. Mais le téléchargement de DotNetOpenAuth comprend des exemples de connexion avec Twitter et Facebook afin que vous ayez quelques conseils là-bas.

Je soupçonne que vous n'aurez pas grand-chose, voire rien, à faire sur le plan des autorisations. Il est livré avec OAuth comme je l'ai déjà dit, et cela vous suffira probablement.

Andrew Arnott
la source
Merci pour la réponse détaillée, je vais consulter le lien que vous avez fourni. Pour clarifier, mon API est suspendue à un sous-domaine de mon site Web, donc ce n'est pas techniquement la même application.
Nathan Ridley
1
Le scénario atypique dans lequel l'application doit s'authentifier auprès du serveur d'autorisation plutôt que de l'utilisateur se produit lorsque les ressources appartiennent à l'application. Par exemple, une application Facebook peut demander au serveur de ressources fb des informations sur l'application et des données statistiques qu'il a collectées sur une période de temps. Ce scénario est abordé dans le flux de travail des informations d'identification du client d'OAuth2
SenG
Puis-je utiliser l'API REST sans oAuth? @Andrew Arnott
Gem
Bien sûr. Toutes les autres API ne nécessitent pas du tout une authentification. Et oauth n'est pas le seul mécanisme d'authentification.
Andrew Arnott
11

Tout d'abord. Vous devez séparer mentalement votre API - des méthodes d'authentification.

Votre API est essentiellement des ressources et des méthodes pour manipuler ces ressources. Et vous pouvez avoir plusieurs méthodes pour authentifier l'accès à votre API.

OAuth est l'un de ces mécanismes d'authentification. Être un fournisseur OAuth est génial, même si la spécification est un peu difficile à comprendre, en particulier les parties qui ont à voir avec les signatures. Une fois que vous avez OAuth en place, les applications clientes ont généralement plus de facilité à s'authentifier, car il y a tellement de bibliothèques «open source, déjà faites, implémentez simplement» disponibles dans la plupart des langues.

Les avantages et les inconvénients d'OAuth sont débattus depuis un certain temps. Mais pour vous faire votre propre opinion, je vous suggère de lire ce guide définitif, rédigé par Eran Hammer-Lahav , l'un des responsables de la spécification OAuth.

Les seules vraies alternatives à OAuth pour autant que je le vois, sont OAuth 2.0 et une simple authentification de base.

En dehors de cela, vous parlez de l'authentification à l'aide d'Open-ID, ou de l'identité Facebook, etc. C'est encore une autre question que vous devez vous poser. Mais cela sort vraiment du cadre des API et OAuth. Pour moi, cela ressemble plus à une question de création d'utilisateurs dans votre service. J'ai peut-être tort.

Jon Nylander
la source
Puis-je utiliser l'API REST sans oAuth? @Jon Nylander
Gem