web-dev-qa-db-fra.com

Comment faire une autorisation basée sur les rôles avec OAuth2 / OpenID Connect?

J'essaie d'utiliser OAuth2 pour l'authentification/l'autorisation, mais après de nombreuses lectures, je suis confus ... J'essaie de comprendre comment OAuth et OpenIDConnect sont liés les uns aux autres, et comment exactement je peux les utiliser pour autorizaton.

D'après ce que j'ai compris jusqu'à présent :

  • OpenID Connect est préférable pour l'authentification, OAuth est préférable pour l'autorisation
  • OAuth2 l'autorisation est effectuée via des étendues
  • Une étendue est l'autorisation donnée par l'utilisateur à un client, validée sur le serveur de ressources

  • un id_token OpenID Connect est principalement destiné à l'application cliente, pour fournir des informations sur l'utilisateur, et NON comme un moyen pour le serveur de ressources de valider l'utilisateur.

Voici mon cas d'utilisation :

  • J'ai besoin de fournir l'authentification unique à un ensemble de services Web complètement sans état que nous avons créés
  • OAuth est limité à la ressource resource_owner
  • Le serveur d'identité est fourni de notre côté, et connecté à un serveur LDAP
  • Seules les applications de confiance peuvent être enregistrées en tant que fournisseurs de services

Et ce que je suis j'essaye de faire, ce qui m'embête :

  • Seuls les utilisateurs autorisés peuvent accéder à une API de service Web donnée

J'ai donc besoin d'un moyen de vérifier l'autorisation donnée par une entité externe à un utilisateur, sur le serveur de ressources. Lequel, je crois, exclut l'utilisation de OAuth pour l'autorisation?

Je ne sais pas comment y parvenir avec la connexion OAuth/OpenID, ou même si cela correspond à mon cas d'utilisation.

  1. L'accès basé sur les rôles peut-il être fait pour fonctionner avec les étendues OAuth2?
  2. Serait-il correct de transmettre le id_token au serveur de ressources, avec une revendication contenant les rôles de l'utilisateur (et de supprimer complètement le access_token)? Ainsi, l'id_token serait utilisé à la fois pour l'authentification et l'autorisation. Étant donné que l'id_token est signé et contient des hachages, ce serait bien, non?
  3. Dois-je simplement m'authentifier auprès d'OpenIDConnect, en vérifiant la présence de id_token, supprimer complètement access_token et développer mon propre système d'autorisation basé sur les rôles?

Toutes mes excuses pour le mur de texte, je ne suis tout simplement pas sûr d'avoir mal compris la portée d'OAuth/OpenID Connect ici. Suis-je en train de faire des hypothèses erronées?

Je vous remercie.

19
lv.

Le concept de rôle peut être utilisé avec des jetons d'accès dans OpenID Connect (Oauth2).

Considérez qu'une étendue est une demande de réclamations sur l'utilisateur qui doit être incluse dans le jeton d'accès. L'API demandant l'accès sait qu'elle a besoin du rôle (par exemple) "employé", y compris le "scope=openid roles "paramètre de requête dans la demande.

Le serveur d'authentification (AS) a accès aux informations de rôle concernant l'utilisateur (par exemple dans un annuaire LDAP). Il peut ensuite rechercher les rôles de l'utilisateur et les inclure dans la revendication "rôles" dans le jeton d'accès.

Vous pouvez également réduire la portée en demandant le rôle lui-même (scope=openid employee), auquel cas l'AS pourrait l'inclure si l'utilisateur est membre de ce groupe. Ceci est un peu moins évolutif car il nécessite une connaissance détaillée des rôles requis, mais réduit la quantité de PII dans le jeton et réduit sa taille. De plus, si l'utilisateur n'est pas membre du groupe spécifié (c'est-à-dire que la portée ne peut pas être incluse dans le jeton), l'AS doit en informer l'API à ce sujet conformément à OAuth2.

L'utilisation du rôle est assez courante, et quelques exemples peuvent être trouvés sur:

Comme pour les questions 2) et 3): ne faites pas ça :)

4
Geir Emblemsvag