web-dev-qa-db-fra.com

Émission de "clés API" à l'aide de Keycloak

Ma configuration comprend trois composants:

  • Une application backend (Python/Flask)
  • Une application frontale (VueJS)
  • Cape de protection

Le frontend utilisera Keycloak pour permettre aux utilisateurs de se connecter et d'utiliser les jetons d'accès pour authentifier les demandes auprès du backend. Jusqu'ici tout va bien.

Maintenant, je veux que les applications tierces puissent faire des demandes authentifiées contre le backend et je me demande comment cela peut être réalisé en utilisant Keycloak? Mon idée est d'émettre un nouvel ensemble d'informations d'identification pour chaque client. Leur application parle ensuite à Keycloak pour obtenir des jetons d'accès. Je peux ensuite utiliser Keycloak pour gérer le contrôle d'accès pour tous les utilisateurs de l'API.

  • Comment une application tierce serait-elle représentée dans Keycloak - client? utilisateur? ...?
  • Existe-t-il des bonnes pratiques pour ce type de cas d'utilisation?
10
Marco Lamina

J'ai finalement trouvé une solution qui fonctionne bien et qui semble être "la manière de Keycloak" pour délivrer des informations d'identification aux applications externes. Pour créer un nouvel ensemble d'informations d'identification, ajoutez un nouveau client Keycloak et modifiez les paramètres suivants:

  • Flux standard activé: [~ # ~] désactivé [~ # ~]
  • Subventions d'accès direct activées: [~ # ~] désactivé [~ # ~]
  • Type d'accès: Confidentiel
  • Comptes de service activés: [~ # ~] sur [~ # ~]

L'application externe utilisera le nom de notre client nouvellement créé comme client_id. Le client_secret a été généré automatiquement et se trouve sous l'onglet Credentials.

Accorder l'accès client à vos services

Si vos services protégés par Keycloak sont configurés pour vérifier la revendication aud des jetons de support entrants, une deuxième étape est nécessaire. Par défaut, l'audience des jetons JWT que Keycloak délivre à votre client sera définie sur le nom de votre client, ils seront donc rejetés par vos services. Vous pouvez utiliser Étendues client pour modifier ce comportement:

  1. Créer une nouvelle étendue client
  2. Sélectionnez "Modèle d'audience"
  3. Sélectionnez le service auquel vous souhaitez accorder l'accès à vos applications externes et cliquez sur "Suivant"
  4. Ajoutez l'étendue au client que vous venez de créer ( Étendues client tab)

Keycloak va maintenant ajouter le nom de votre service à la revendication aud de tous les jetons JWT qu'il émet à votre nouveau client. Consultez la documentation de Keycloak sur Service Accounts pour plus de détails.

Échange des informations d'identification client pour un jeton d'accès

Une application externe peut désormais utiliser ses informations d'identification pour obtenir un jeton d'accès à partir du point de terminaison de jeton de Keycloak:

POST {keycloak-url}/auth/realms/atlas/protocol/openid-connect/token

  • Met le Content-Type en-tête à application/x-www-form-urlencoded
  • Authentifiez la demande avec Authentification de base, en utilisant votre identifiant client en tant qu'utilisateur et votre secret client comme mot de passe
  • Ensemble grant_type=client_credentials dans le corps de la demande
13
Marco Lamina