Ma configuration comprend trois composants:
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.
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:
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.
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:
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.
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
Content-Type
en-tête à application/x-www-form-urlencoded
grant_type=client_credentials
dans le corps de la demande